Java を使用して Axon Framework に基づいたイベント駆動型アプリケーションを開発する方法
1. 背景の紹介
Axon Framework は、イベントの構築に使用される Java プログラムです。 -駆動型アプリケーションフレーム。 CQRS (Command Query Responsibility Segregation) およびイベント駆動型アーキテクチャ (EDA) を実装するためのコア機能とツールを提供します。 Axon Framework は優れたスケーラビリティと柔軟性を備えているため、開発者は複雑なアプリケーションを簡単に構築および保守できます。
2. 環境セットアップ
開発を開始する前に、環境をセットアップする必要があります。まず、Java SDK と Maven ビルド ツールがインストールされていることを確認します。次に、次の手順に従って、必要な依存関係を導入します。
プロジェクトの 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>
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 では、イベントとコマンドがアプリケーションの中核概念です。イベントはシステム内で発生する事実であり、コマンドはシステムの状態を変更するために使用されるアクションです。
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 }
4. 集約ルートを作成します
集約ルートは、一意の ID を持つドメイン オブジェクトです。外部の処理を担当します。コマンドを実行し、対応するイベントを生成します。
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(); } }
という名前の 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. コマンド プロセッサを作成します
コマンド プロセッサは、外部コマンドを処理し、それらを適切な集約ルートにディスパッチします。
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. クエリ モデル#を作成します。 ##クエリ モデルは、外部クエリを処理し、適切な結果を返す責任があります。
OrderQueryModel という名前の Java クラスを作成し、そのフィールドとメソッドを定義します。
@Entity public class OrderQueryModel { @Id private String orderId; private String customerName; // Getter and Setter }
OrderQueryModelRepository と
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 を作成します。
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); } }
の 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>
という名前の 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>
という名前の 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>
main
メソッドを実行して、アプリケーションを開始します。
URL: http://localhost:8080/orders Method: POST Body: {"customerName": "John Doe"}
URL: http://localhost:8080/orders/{orderId} Method: GET
以上がJava を使用して Axon Framework に基づいたイベント駆動型アプリケーションを開発する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。