Heim  >  Artikel  >  Java  >  Wie man mit Java eine ereignisgesteuerte Anwendung basierend auf dem Axon Framework entwickelt

Wie man mit Java eine ereignisgesteuerte Anwendung basierend auf dem Axon Framework entwickelt

PHPz
PHPzOriginal
2023-09-20 11:15:111460Durchsuche

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

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:

  1. 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.
  2. Erstellen Sie eine Java-Klasse mit dem Namen OrderCreatedEvent und definieren Sie die Eigenschaften darin:
  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>


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
  1. 4. Erstellen Sie einen Aggregatstamm OrderCreatedEvent的Java类,并定义其中的属性:

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

    public class CreateOrderCommand {
    
     private String orderId;
     private String customerName;
    
     // Getter and Setter
    }

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

  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();
     }
    }
  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;
     }
    }

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

  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()));
     }
    }

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

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

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

    @Repository
    public interface OrderQueryModelRepository extends CrudRepository<OrderQueryModel, String> {
    }
  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);
     }
    }

七、创建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);
     }
    }
  2. 创建一个名为CreateOrderDTO的Java类,并定义其中的属性:

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

    public class GetOrderQuery {
    
     private String orderId;
    
     // Getter and Setter
    }

八、启动应用程序

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

    @SpringBootApplication
    public class Application {
    
     public static void main(String[] args) {
         SpringApplication.run(Application.class, args);
     }
    }
  2. 运行Application类的mainDer 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"}
  1. Erstellen Sie eine Java-Klasse mit dem Namen OrderAggregateIdentifierResolver und implementieren Sie den AggregateIdentifierResolver-Schnittstelle:

    URL: http://localhost:8080/orders/{orderId}
    Method: GET
  2. 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:

rrreee🎜🎜🎜 6. Erstellen Sie ein Abfragemodell 🎜Das Abfragemodell ist für die Verarbeitung externer Abfragen und die Rückgabe geeigneter Ergebnisse verantwortlich. 🎜🎜🎜🎜Erstellen Sie eine Java-Klasse mit dem Namen 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 Applications 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn