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:
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.OrderCreatedEvent
dan tentukan sifat di dalamnya: <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>
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
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 }
创建一个名为CreateOrderCommand
的Java类,并定义其中的属性:
public class CreateOrderCommand { private String orderId; private String customerName; // Getter and Setter }
四、创建聚合根
聚合根是一个具有唯一标识的领域对象,它负责处理外部命令并生成相应的事件。
创建一个名为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(); } }
创建一个名为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; } }
五、创建命令处理器
命令处理器负责处理外部命令,并将其分发给相应的聚合根。
创建一个名为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())); } }
六、创建查询模型
查询模型负责处理外部查询,并返回适当的结果。
创建一个名为OrderQueryModel
的Java类,并定义其中的字段和方法:
@Entity public class OrderQueryModel { @Id private String orderId; private String customerName; // Getter and Setter }
创建一个名为OrderQueryModelRepository
的Java接口,并继承CrudRepository
:
@Repository public interface OrderQueryModelRepository extends CrudRepository<OrderQueryModel, String> { }
创建一个名为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); } }
七、创建REST API
创建REST API以供外部调用。
创建一个名为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); } }
创建一个名为CreateOrderDTO
的Java类,并定义其中的属性:
public class CreateOrderDTO { private String customerName; // Getter and Setter }
创建一个名为GetOrderQuery
的Java类,并定义其中的属性:
public class GetOrderQuery { private String orderId; // Getter and Setter }
八、启动应用程序
创建一个名为Application
的Java类,并添加@SpringBootApplication
注解:
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
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"}
OrderAggregateIdentifierResolver the
dan Laksanakan Antara muka AggregateIdentifierResolver: URL: http://localhost:8080/orders/{orderId} Method: GET
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
OrderQueryModel
dan tentukan medan dan kaedah di dalamnya: 🎜rrreee🎜🎜🎜Buat antara muka Java bernama OrderQueryModelRepository
dan Inherit 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!