So verwenden Sie Java, um eine ereignisgesteuerte Anwendung basierend auf Axon Framework zu entwickeln
1 Hintergrundeinführung
Axon Framework ist ein Java-Framework zum Erstellen ereignisgesteuerter Anwendungen. Es bietet Kernfunktionen und Tools für die Implementierung von CQRS (Command Query Responsibility Segregation) und ereignisgesteuerter Architektur (EDA). Axon Framework verfügt über eine gute Skalierbarkeit und Flexibilität, sodass Entwickler problemlos komplexe Anwendungen erstellen und verwalten können.
2. Umgebungseinrichtung
Bevor wir mit der Entwicklung beginnen, müssen wir die Umgebung einrichten. Vergewissern Sie sich zunächst, dass das Java SDK und die Maven-Build-Tools installiert wurden. Führen Sie als Nächstes die erforderlichen Abhängigkeiten durch die folgenden Schritte ein:
Fügen Sie die folgenden Abhängigkeiten im POM des Projekts hinzu. Definieren von Ereignissen und Befehlen.
In Axon Framework sind Ereignisse und Befehle Kernkonzepte in Anwendungen. Ereignisse sind Tatsachen, die im System auftreten, während Befehle Aktionen sind, die dazu dienen, den Zustand des Systems zu ändern.OrderCreatedEvent
und definieren Sie die Eigenschaften darin: <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>
Erstellen Sie eine Java-Klasse mit dem Namen CreateOrderCommand
und definieren Sie ihre Attribute:
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
4. Erstellen Sie einen Aggregatstamm 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
Der Aggregatstamm ist ein Domänenobjekt mit einer eindeutigen Identität, das für die Verarbeitung externer Befehle und die Generierung entsprechender Ereignisse verantwortlich ist.
Erstellen Sie eine Java-Klasse mit dem Namen OrderAggregate
und definieren Sie die darin enthaltenen Felder und Methoden:
URL: http://localhost:8080/orders Method: POST Body: {"customerName": "John Doe"}
Erstellen Sie eine Java-Klasse mit dem Namen OrderAggregateIdentifierResolver
und implementieren Sie den AggregateIdentifierResolver
-Schnittstelle:
URL: http://localhost:8080/orders/{orderId} Method: GET
5. Erstellen Sie einen Befehlsprozessor
Der Befehlsprozessor ist für die Verarbeitung externer Befehle und deren Verteilung an den entsprechenden Aggregatstamm verantwortlich.
Erstellen Sie eine Java-Klasse mit dem Namen OrderCommandHandler
und definieren Sie die Methoden darin:
OrderQueryModel
und definieren Sie die darin enthaltenen Felder und Methoden: 🎜rrreee🎜🎜🎜Erstellen Sie eine Java-Schnittstelle mit dem Namen OrderQueryModelRepository
und erben Sie CrudRepository
: 🎜rrreee🎜🎜🎜Erstellen Sie eine Java-Klasse mit dem Namen OrderQueryHandler
und definieren Sie die Methoden darin: 🎜rrreee🎜🎜🎜 7. Erstellen Sie eine REST-API.🎜Erstellen Sie eine REST-API für externe Aufrufe. 🎜🎜🎜🎜Erstellen Sie eine Java-Klasse mit dem Namen OrderController
und definieren Sie die darin enthaltenen Methoden: 🎜rrreee🎜🎜🎜Erstellen Sie eine Java-Klasse mit dem Namen CreateOrderDTO
und definieren Sie ihre Attribute: 🎜rrreee🎜 🎜🎜Erstellen Sie eine Java-Klasse mit dem Namen GetOrderQuery
und definieren Sie ihre Attribute: 🎜rrreee🎜🎜🎜 8. Starten Sie die Anwendung 🎜🎜🎜🎜Erstellen Sie eine Klasse mit dem Namen Application
s Java-Klasse , und fügen Sie die Annotation @SpringBootApplication
hinzu: 🎜rrreee🎜🎜Führen Sie die Methode main
der Klasse Application
aus, um das Anwendungsprogramm zu starten. 🎜🎜🎜9. Testen Sie die Anwendung. 🎜Verwenden Sie Postman oder ein ähnliches Tool, um HTTP-Anfragen zu senden, um die Funktionalität der Anwendung zu testen. 🎜🎜🎜🎜Senden Sie eine POST-Anfrage, um eine Bestellung zu erstellen: 🎜rrreee🎜🎜🎜Senden Sie eine GET-Anfrage, um Bestellinformationen zu erhalten: 🎜rrreee🎜🎜🎜10. Zusammenfassung🎜In diesem Artikel wird erläutert, wie Sie mit Java eine ereignisgesteuerte Anwendung entwickeln basierend auf dem Axon Framework. Durch die Definition von Ereignissen und Befehlen, die Erstellung von Aggregatwurzeln, Befehlshandlern, Abfragemodellen und REST-APIs können wir das Axon Framework nutzen, um effiziente und skalierbare ereignisgesteuerte Anwendungen zu erstellen. 🎜Das obige ist der detaillierte Inhalt vonWie man mit Java eine ereignisgesteuerte Anwendung basierend auf dem Axon Framework entwickelt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!