【发布时间】:2020-11-29 23:32:06
【问题描述】:
我使用 Axon 和 Spring Boot 实现了 SAGA。这是简单的订单和客户服务。一切看起来都很好,但是当我通过邮递员发送帖子请求时,我得到 404 NOT FOUND。我猜这个问题与 OrderManagementSaga.java 有关请帮帮我!
OrderManagementSaga.java
@Saga
public class OrderManagementSaga {
@Inject
private transient CommandGateway commandGateway;
@StartSaga
@SagaEventHandler(associationProperty = "orderId")
public void handle(OrderCreatedEvent orderCreatedEvent){
SagaLifecycle.associateWith("customerId", orderCreatedEvent.customerId);
commandGateway.send(new CreateInvoiceCommand(orderCreatedEvent.customerId,orderCreatedEvent.price,orderCreatedEvent.orderId));
}
@SagaEventHandler(associationProperty = "customerId")
public void handle(InvoiceCreatedEvent invoiceCreatedEvent){
SagaLifecycle.associateWith("orderId",invoiceCreatedEvent.orderId);
commandGateway.send(new UpdateOrderStatusCommand(invoiceCreatedEvent.orderId, invoiceCreatedEvent.price, invoiceCreatedEvent.customerId));
}
@SagaEventHandler(associationProperty = "orderId")
public void handle(OrderUpdatedEvent orderUpdatedEvent){
SagaLifecycle.end();
}
}
OrderCommandController.java
@RestController
public class OrderCommandController {
private OrderCommandService orderCommandService;
public OrderCommandController(OrderCommandService orderCommandService) {
this.orderCommandService = orderCommandService;
}
@PostMapping("/orders")
public CompletableFuture<String> createOrder(@RequestBody OrderCreateDTO orderCreateDTO){
return orderCommandService.createOrder(orderCreateDTO);
}
}
OrderAggregate.java
@Aggregate
public class OrderAggregate {
@AggregateIdentifier
private String orderId;
private BigDecimal price;
private OrderStatus orderStatus;
private String customerId;
public OrderAggregate() {
}
@CommandHandler
public OrderAggregate(CreateOrderCommand createOrderCommand) {
AggregateLifecycle.apply(new OrderCreatedEvent(createOrderCommand.orderId,createOrderCommand.price, createOrderCommand.customerId));
}
@EventSourcingHandler
protected void on(OrderCreatedEvent orderCreatedEvent) {
this.orderId = orderCreatedEvent.orderId;
this.customerId = orderCreatedEvent.customerId;
this.orderStatus = OrderStatus.CREATED;
}
@CommandHandler
protected void on(UpdateOrderStatusCommand updateOrderStatusCommand) {
AggregateLifecycle
.apply(new OrderUpdatedEvent(updateOrderStatusCommand.orderId,updateOrderStatusCommand.customerıd,updateOrderStatusCommand.price,OrderStatus.CREATED));
}
@EventSourcingHandler
protected void on(OrderUpdatedEvent orderUpdatedEvent) {
this.customerId = orderUpdatedEvent.customerId;
this.orderId = orderUpdatedEvent.orderId;
this.orderStatus = OrderStatus.APPROVED;
this.price = orderUpdatedEvent.price;
}
CustomerAggregate.java
@Aggregate
public class CustomerAggregate {
@AggregateIdentifier
private String customerId;
private BigDecimal budget;
private String orderId;
public CustomerAggregate(String customerId, BigDecimal budget, String orderId) {
super();
this.customerId = customerId;
this.budget = budget;
this.orderId = orderId;
}
@CommandHandler
public CustomerAggregate(CreateInvoiceCommand createInvoiceCommand){
AggregateLifecycle.apply(new InvoiceCreatedEvent(createInvoiceCommand.price, createInvoiceCommand.customerId, createInvoiceCommand.orderId));
}
@EventSourcingHandler
protected void on(InvoiceCreatedEvent invoiceCreatedEvent){
this.customerId = invoiceCreatedEvent.customerId;
this.budget = this.budget.subtract(invoiceCreatedEvent.price);
this.orderId = invoiceCreatedEvent.orderId;
}
public String getCustomerId() {
return customerId;
}
public void setCustomerId(String customerId) {
this.customerId = customerId;
}
public BigDecimal getBudget() {
return budget;
}
public void setBudget(BigDecimal budget) {
this.budget = budget;
}
}
我认为问题与命令和事件类无关,所以我只分享其中一个作为示例; CreateOrderCommand.java
public class CreateOrderCommand {
@TargetAggregateIdentifier
public final String orderId;
public final String customerId;
public final BigDecimal price;
public CreateOrderCommand(String orderId, String customerId, BigDecimal price) {
super();
this.orderId = orderId;
this.customerId = customerId;
this.price = price;
}
}
【问题讨论】:
标签: java spring-boot event-handling axon saga