Rumah > Java > javaTutorial > teks badan

Cara menggunakan Java untuk membangunkan aplikasi dipacu peristiwa berdasarkan Rangka Kerja Axon

PHPz
Lepaskan: 2023-09-20 11:15:11
asal
1435 orang telah melayarinya

如何使用Java开发一个基于Axon Framework的事件驱动应用

Cara menggunakan Java untuk membangunkan aplikasi dipacu peristiwa berdasarkan Rangka Kerja Axon

1 Pengenalan Latar Belakang
Rangka Kerja Axon ialah rangka kerja Java untuk membina aplikasi dipacu acara. Ia menyediakan fungsi teras dan alatan untuk melaksanakan CQRS (Command Query Responsibility Segregation) dan seni bina dipacu peristiwa (EDA). Rangka Kerja Axon mempunyai kebolehskalaan dan fleksibiliti yang baik, membolehkan pembangun membina dan menyelenggara aplikasi yang kompleks dengan mudah.

2. Persediaan persekitaran
Sebelum memulakan pembangunan, kita perlu menyediakan persekitaran. Mula-mula, sahkan bahawa alat binaan Java SDK dan Maven telah dipasang. Seterusnya, perkenalkan kebergantungan yang diperlukan melalui langkah-langkah berikut:

  1. Tambahkan kebergantungan berikut dalam pom projek Mentakrifkan peristiwa dan arahan

    Dalam Rangka Kerja Axon, peristiwa dan arahan ialah konsep teras dalam aplikasi. Peristiwa ialah fakta yang berlaku dalam sistem, manakala arahan ialah tindakan yang digunakan untuk mengubah keadaan sistem.
  2. Buat kelas Java bernama OrderCreatedEvent dan tentukan sifat di dalamnya:
  3. <dependencies>
     <dependency>
         <groupId>org.axonframework</groupId>
         <artifactId>axon-spring-boot-starter</artifactId>
         <version>4.1.3</version>
     </dependency>
     <dependency>
         <groupId>org.axonframework</groupId>
         <artifactId>axon-test</artifactId>
         <version>4.1.3</version>
         <scope>test</scope>
     </dependency>
    </dependencies>
    Salin selepas log masuk


Buat kelas Java bernama CreateOrderCommand dan takrifkannya Atribut:

spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
Salin selepas log masuk
  1. 4. Buat punca agregat

    Pusat agregat ialah objek domain dengan identiti unik, yang bertanggungjawab untuk memproses arahan luaran dan menjana peristiwa yang sepadan. OrderCreatedEvent的Java类,并定义其中的属性:

    public class OrderCreatedEvent {
    
     private String orderId;
     private String customerName;
    
     // Getter and Setter
    }
    Salin selepas log masuk
  2. 创建一个名为CreateOrderCommand的Java类,并定义其中的属性:

    public class CreateOrderCommand {
    
     private String orderId;
     private String customerName;
    
     // Getter and Setter
    }
    Salin selepas log masuk

四、创建聚合根
聚合根是一个具有唯一标识的领域对象,它负责处理外部命令并生成相应的事件。

  1. 创建一个名为OrderAggregate的Java类,并定义其中的字段和方法:

    @Aggregate
    public class OrderAggregate {
    
     @AggregateIdentifier
     private String orderId;
     private String customerName;
    
     public OrderAggregate() {
     }
    
     @CommandHandler
     public OrderAggregate(CreateOrderCommand command) {
         AggregateLifecycle.apply(new OrderCreatedEvent(command.getOrderId(), command.getCustomerName()));
     }
    
     @EventSourcingHandler
     public void on(OrderCreatedEvent event) {
         this.orderId = event.getOrderId();
         this.customerName = event.getCustomerName();
     }
    }
    Salin selepas log masuk
  2. 创建一个名为OrderAggregateIdentifierResolver的Java类,并实现AggregateIdentifierResolver接口:

    @Component
    public class OrderAggregateIdentifierResolver implements AggregateIdentifierResolver {
    
     @Override
     public String resolveId(Object command) {
         if (command instanceof CreateOrderCommand) {
             return ((CreateOrderCommand) command).getOrderId();
         }
         return null;
     }
    }
    Salin selepas log masuk

五、创建命令处理器
命令处理器负责处理外部命令,并将其分发给相应的聚合根。

  1. 创建一个名为OrderCommandHandler的Java类,并定义其中的方法:

    @Component
    public class OrderCommandHandler {
    
     private final CommandGateway commandGateway;
    
     public OrderCommandHandler(CommandGateway commandGateway) {
         this.commandGateway = commandGateway;
     }
    
     @CommandHandler
     public void handle(CreateOrderCommand command) {
         commandGateway.send(new CreateOrderCommand(command.getOrderId(), command.getCustomerName()));
     }
    }
    Salin selepas log masuk

六、创建查询模型
查询模型负责处理外部查询,并返回适当的结果。

  1. 创建一个名为OrderQueryModel的Java类,并定义其中的字段和方法:

    @Entity
    public class OrderQueryModel {
    
     @Id
     private String orderId;
     private String customerName;
    
     // Getter and Setter
    }
    Salin selepas log masuk
  2. 创建一个名为OrderQueryModelRepository的Java接口,并继承CrudRepository

    @Repository
    public interface OrderQueryModelRepository extends CrudRepository<OrderQueryModel, String> {
    }
    Salin selepas log masuk
  3. 创建一个名为OrderQueryHandler的Java类,并定义其中的方法:

    @Component
    public class OrderQueryHandler {
    
     private final OrderQueryModelRepository orderQueryModelRepository;
    
     public OrderQueryHandler(OrderQueryModelRepository orderQueryModelRepository) {
         this.orderQueryModelRepository = orderQueryModelRepository;
     }
    
     @QueryHandler
     public OrderQueryModel handle(GetOrderQuery query) {
         return orderQueryModelRepository.findById(query.getOrderId()).orElse(null);
     }
    }
    Salin selepas log masuk

七、创建REST API
创建REST API以供外部调用。

  1. 创建一个名为OrderController的Java类,并定义其中的方法:

    @RestController
    @RequestMapping("/orders")
    public class OrderController {
    
     private final CommandGateway commandGateway;
     private final QueryGateway queryGateway;
    
     public OrderController(CommandGateway commandGateway, QueryGateway queryGateway) {
         this.commandGateway = commandGateway;
         this.queryGateway = queryGateway;
     }
    
     @PostMapping
     public ResponseEntity<String> create(@RequestBody CreateOrderDTO createOrderDTO) {
         String orderId = UUID.randomUUID().toString();
         commandGateway.send(new CreateOrderCommand(orderId, createOrderDTO.getCustomerName()));
         return ResponseEntity.ok(orderId);
     }
    
     @GetMapping("/{orderId}")
     public ResponseEntity<OrderQueryModel> get(@PathVariable String orderId) throws ExecutionException, InterruptedException {
         OrderQueryModel order = queryGateway.query(new GetOrderQuery(orderId), ResponseTypes.instanceOf(OrderQueryModel.class)).get();
         if (order == null) {
             return ResponseEntity.notFound().build();
         }
         return ResponseEntity.ok(order);
     }
    }
    Salin selepas log masuk
  2. 创建一个名为CreateOrderDTO的Java类,并定义其中的属性:

    public class CreateOrderDTO {
    
     private String customerName;
    
     // Getter and Setter
    }
    Salin selepas log masuk
  3. 创建一个名为GetOrderQuery的Java类,并定义其中的属性:

    public class GetOrderQuery {
    
     private String orderId;
    
     // Getter and Setter
    }
    Salin selepas log masuk

八、启动应用程序

  1. 创建一个名为Application的Java类,并添加@SpringBootApplication注解:

    @SpringBootApplication
    public class Application {
    
     public static void main(String[] args) {
         SpringApplication.run(Application.class, args);
     }
    }
    Salin selepas log masuk
  2. 运行Application类的main

Buat kelas Java bernama OrderAggregate dan tentukan medan dan kaedah di dalamnya:

URL: http://localhost:8080/orders
Method: POST
Body: {"customerName": "John Doe"}
Salin selepas log masuk

  1. Buat kelas Java bernama OrderAggregateIdentifierResolver the dan Laksanakan Antara muka AggregateIdentifierResolver:

    URL: http://localhost:8080/orders/{orderId}
    Method: GET
    Salin selepas log masuk
  2. 5. Buat pemproses arahan

    Pemproses arahan bertanggungjawab untuk memproses arahan luaran dan mengedarkannya kepada akar agregat yang sepadan.

Buat kelas Java bernama OrderCommandHandler dan tentukan kaedah di dalamnya:
rrreee

🎜🎜 6. Buat model pertanyaan 🎜Model pertanyaan bertanggungjawab memproses pertanyaan luaran dan mengembalikan hasil yang sesuai. 🎜🎜🎜🎜Buat kelas Java bernama OrderQueryModel dan tentukan medan dan kaedah di dalamnya: 🎜rrreee🎜🎜🎜Buat antara muka Java bernama OrderQueryModelRepository dan Inherit : 🎜rrreee🎜🎜🎜Buat kelas Java bernama OrderQueryHandler dan tentukan kaedah di dalamnya: 🎜rrreee🎜🎜🎜 7. Cipta REST API🎜Buat REST API untuk panggilan luaran. 🎜🎜🎜🎜Buat kelas Java bernama OrderController dan tentukan kaedah di dalamnya: 🎜rrreee🎜🎜🎜Buat kelas Java bernama CreateOrderDTO dan tentukan Atribut: 🎜 🎜🎜Buat kelas Java bernama GetOrderQuery dan tentukan atributnya: 🎜rrreee🎜🎜🎜 8. Mulakan aplikasi 🎜🎜🎜🎜Buat kelas bernama Application class's , dan tambahkan anotasi @SpringBootApplication: 🎜rrreee🎜🎜Jalankan kaedah utama kelas Application untuk memulakan program aplikasi. 🎜🎜🎜9 Uji aplikasi🎜Gunakan Posman atau alat yang serupa untuk menghantar permintaan HTTP untuk menguji kefungsian aplikasi. 🎜🎜🎜🎜Hantar permintaan POST untuk membuat pesanan: 🎜rrreee🎜🎜🎜Hantar permintaan GET untuk mendapatkan maklumat pesanan: 🎜rrreee🎜🎜🎜10. Ringkasan🎜Aplikasi ini memperkenalkan cara-menggunakan Javan berdasarkan Rangka Kerja Axon. Dengan mentakrifkan peristiwa dan perintah, mencipta akar agregat, pengendali arahan, model pertanyaan dan API REST, kami boleh menggunakan Rangka Kerja Axon untuk membina aplikasi dipacu peristiwa yang cekap dan berskala. 🎜

Atas ialah kandungan terperinci Cara menggunakan Java untuk membangunkan aplikasi dipacu peristiwa berdasarkan Rangka Kerja Axon. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!