検索
ホームページJava&#&チュートリアルJava を使用して Axon Framework に基づいたイベント駆動型アプリケーションを開発する方法

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

Sep 20, 2023 am 11:15 AM
イベント駆動型アプリケーションJava開発axon framework

如何使用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 クラスを作成し、そのプロパティを定義します。 <pre class='brush:php;toolbar:false;'>public class CreateOrderDTO { private String customerName; // Getter and Setter }</pre>

  3. GetOrderQuery

    という名前の Java クラスを作成し、そのプロパティを定義します。 :<pre class='brush:php;toolbar:false;'>public class GetOrderQuery { private String orderId; // Getter and Setter }</pre>

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

  1. Application

    という名前の Java クラスを作成し、@SpringBootApplication 注: <pre class='brush:php;toolbar:false;'>@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }</pre>

  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 サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JVMは、Javaの「Write and、Run Anywhere」(Wora)機能にどのように貢献しますか?JVMは、Javaの「Write and、Run Anywhere」(Wora)機能にどのように貢献しますか?May 02, 2025 am 12:25 AM

JVMは、バイトコード解釈、プラットフォームに依存しないAPI、動的クラスの負荷を介してJavaのWORA機能を実装します。 2。標準API抽象オペレーティングシステムの違い。 3.クラスは、実行時に動的にロードされ、一貫性を確保します。

Javaの新しいバージョンは、プラットフォーム固有の問題にどのように対処しますか?Javaの新しいバージョンは、プラットフォーム固有の問題にどのように対処しますか?May 02, 2025 am 12:18 AM

Javaの最新バージョンは、JVMの最適化、標準的なライブラリの改善、サードパーティライブラリサポートを通じて、プラットフォーム固有の問題を効果的に解決します。 1)Java11のZGCなどのJVM最適化により、ガベージコレクションのパフォーマンスが向上します。 2)Java9のモジュールシステムなどの標準的なライブラリの改善は、プラットフォーム関連の問題を削減します。 3)サードパーティライブラリは、OpenCVなどのプラットフォーム最適化バージョンを提供します。

JVMによって実行されたバイトコード検証のプロセスを説明します。JVMによって実行されたバイトコード検証のプロセスを説明します。May 02, 2025 am 12:18 AM

JVMのバイトコード検証プロセスには、4つの重要な手順が含まれます。1)クラスファイル形式が仕様に準拠しているかどうかを確認し、2)バイトコード命令の有効性と正確性を確認し、3)データフロー分析を実行してタイプの安全性を確保し、検証の完全性とパフォーマンスのバランスをとる。これらの手順を通じて、JVMは、安全で正しいバイトコードのみが実行されることを保証し、それによりプログラムの完全性とセキュリティを保護します。

プラットフォームの独立性は、Javaアプリケーションの展開をどのように簡素化しますか?プラットフォームの独立性は、Javaアプリケーションの展開をどのように簡素化しますか?May 02, 2025 am 12:15 AM

java'splatformendencealLowsApplicationStorunOperatingSystemwithajvm.1)singlecodebase:writeandcompileonceforallplatforms.2)easyUpdates:updatebytecodeforsimultaneousdeployment.3)テストの実験効果:scalbortffortfforduniverbehaviol.4)

Javaのプラットフォームの独立性は、時間とともにどのように進化しましたか?Javaのプラットフォームの独立性は、時間とともにどのように進化しましたか?May 02, 2025 am 12:12 AM

Javaのプラットフォームの独立性は、JVM、JITコンピレーション、標準化、ジェネリック、ラムダ式、Projectpanamaなどのテクノロジーを通じて継続的に強化されています。 1990年代以来、Javaは基本的なJVMから高性能モダンJVMに進化し、さまざまなプラットフォームでのコードの一貫性と効率を確保しています。

Javaアプリケーションでプラットフォーム固有の問題を緩和するためのいくつかの戦略は何ですか?Javaアプリケーションでプラットフォーム固有の問題を緩和するためのいくつかの戦略は何ですか?May 01, 2025 am 12:20 AM

Javaはプラットフォーム固有の問題をどのように軽減しますか? Javaは、JVMおよび標準ライブラリを通じてプラットフォームに依存します。 1)bytecodeとjvmを使用して、オペレーティングシステムの違いを抽象化します。 2)標準のライブラリは、パスクラス処理ファイルパス、CHARSETクラス処理文字エンコードなど、クロスプラットフォームAPIを提供します。 3)最適化とデバッグのために、実際のプロジェクトで構成ファイルとマルチプラットフォームテストを使用します。

Javaのプラットフォームの独立性とマイクロサービスアーキテクチャの関係は何ですか?Javaのプラットフォームの独立性とマイクロサービスアーキテクチャの関係は何ですか?May 01, 2025 am 12:16 AM

java'splatformentencentenhancesmicroservicesecturectureby byofferingdeploymentflexability、一貫性、スケーラビリティ、およびポート可能性。1)展開の展開の展開は、AllosmicRoserviThajvm.2)deploymentflexibility lowsmicroserviceSjvm.2)一貫性のあるAcrossServicessimplisimpligiessdevelisementand

GraalvmはJavaのプラットフォーム独立目標とどのように関係していますか?GraalvmはJavaのプラットフォーム独立目標とどのように関係していますか?May 01, 2025 am 12:14 AM

Graalvmは、Javaのプラットフォームの独立性を3つの方法で強化します。1。言語間の相互運用性、Javaが他の言語とシームレスに相互運用できるようにします。 2。独立したランタイム環境、graalvmnativeimageを介してJavaプログラムをローカル実行可能ファイルにコンパイルします。 3.パフォーマンスの最適化、Graalコンパイラは、Javaプログラムのパフォーマンスと一貫性を改善するための効率的なマシンコードを生成します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン