Java を使用して Axon Framework に基づいたイベント駆動型アプリケーションを開発する方法

PHPz
リリース: 2023-09-20 11:15:11
オリジナル
1435 人が閲覧しました

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

Java を使用して Axon Framework に基づいたイベント駆動型アプリケーションを開発する方法

1. 背景の紹介
Axon Framework は、イベントの構築に使用される Java プログラムです。 -駆動型アプリケーションフレーム。 CQRS (Command Query Responsibility Segregation) およびイベント駆動型アーキテクチャ (EDA) を実装するためのコア機能とツールを提供します。 Axon Framework は優れたスケーラビリティと柔軟性を備えているため、開発者は複雑なアプリケーションを簡単に構築および保守できます。

2. 環境セットアップ
開発を開始する前に、環境をセットアップする必要があります。まず、Java SDK と Maven ビルド ツールがインストールされていることを確認します。次に、次の手順に従って、必要な依存関係を導入します。

  1. プロジェクトの pom.xml ファイルに次の依存関係を追加します。

    <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>
    ログイン後にコピー
  2. In Add application.properties ファイルに次の設定を追加します:

    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
    ログイン後にコピー

3. イベントとコマンドの定義
Axon Framework では、イベントとコマンドがアプリケーションの中核概念です。イベントはシステム内で発生する事実であり、コマンドはシステムの状態を変更するために使用されるアクションです。

  1. 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
    }
    ログイン後にコピー

4. 集約ルートを作成します
集約ルートは、一意の ID を持つドメイン オブジェクトです。外部の処理を担当します。コマンドを実行し、対応するイベントを生成します。

  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. という名前の Java クラスを作成します。 OrderAggregateIdentifierResolver を実装し、AggregateIdentifierResolver インターフェイスを実装します。

    @Component
    public class OrderAggregateIdentifierResolver implements AggregateIdentifierResolver {
    
     @Override
     public String resolveId(Object command) {
         if (command instanceof CreateOrderCommand) {
             return ((CreateOrderCommand) command).getOrderId();
         }
         return null;
     }
    }
    ログイン後にコピー

5. コマンド プロセッサを作成します
コマンド プロセッサは、外部コマンドを処理し、それらを適切な集約ルートにディスパッチします。

  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()));
     }
    }
    ログイン後にコピー

6. クエリ モデル#を作成します。 ##クエリ モデルは、外部クエリを処理し、適切な結果を返す責任があります。

  1. OrderQueryModel という名前の Java クラスを作成し、そのフィールドとメソッドを定義します。

    @Entity
    public class OrderQueryModel {
    
     @Id
     private String orderId;
     private String customerName;
    
     // Getter and Setter
    }
    ログイン後にコピー

  2. という名前の Java インターフェイスを作成します。

    OrderQueryModelRepositoryCrudRepository の継承:

    @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);
     }
    }
    ログイン後にコピー

7. 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 クラスを作成し、そのプロパティを定義します。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:java;toolbar:false;'>public class CreateOrderDTO { private String customerName; // Getter and Setter }</pre><div class="contentsignin">ログイン後にコピー</div></div>

  3. GetOrderQuery

    という名前の Java クラスを作成し、そのプロパティを定義します。 :<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:java;toolbar:false;'>public class GetOrderQuery { private String orderId; // Getter and Setter }</pre><div class="contentsignin">ログイン後にコピー</div></div>

  4. 8. アプリケーションを開始します

  1. Application

    という名前の Java クラスを作成し、@SpringBootApplication 注: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:java;toolbar:false;'>@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }</pre><div class="contentsignin">ログイン後にコピー</div></div>

  2. Application
  3. クラスの main メソッドを実行して、アプリケーションを開始します。
  4. 9. アプリケーションをテストする
Postman または同様のツールを使用して HTTP リクエストを送信し、アプリケーションの機能をテストします。


    POST リクエストを送信して注文を作成します:
  1. URL: http://localhost:8080/orders
    Method: POST
    Body: {"customerName": "John Doe"}
    ログイン後にコピー

  2. GET リクエストを送信して注文情報を取得します:
  3. URL: http://localhost:8080/orders/{orderId}
    Method: GET
    ログイン後にコピー

  4. 10. 概要
この記事では、Java を使用して Axon Framework に基づいたイベント駆動型アプリケーションを開発する方法を紹介します。イベントとコマンドを定義し、集約ルート、コマンド ハンドラー、クエリ モデル、REST API を作成することで、Axon Framework を使用して効率的でスケーラブルなイベント駆動型アプリケーションを構築できます。

以上がJava を使用して Axon Framework に基づいたイベント駆動型アプリケーションを開発する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!