我正在尝试使用Axon和Saga设计模式在Micorservices之间发送数据,使用Java我有两个服务,一个用于订单,一个用于产品CQRS设计模式完美地工作,我的意思是我将数据发送到axon,我在仪表板中看到它,然后通过查询数据获取并保存在读取数据库(MySQL)中。今天我尝试使用Saga设计模式,当创建新订单时,将保留产品命令发送到axon并通过产品服务获取,但saga没有事件启动,我不知道为什么
在订单服务中的Saga类下面,它应该获取OrderCreatedEvent并记录消息,但它没有
@Saga
public class OrderSaga {
private final transient CommandGateway commandGateway;
private static final Logger LOGGER = LoggerFactory.getLogger(OrderSaga.class);
@Autowired
public OrderSaga(CommandGateway commandGateway) {
this.commandGateway = commandGateway;
}
@StartSaga
@SagaEventHandler(associationProperty = "orderId")
public void handle(OrderCreatedEvent orderCreatedEvent) {
ReserveProductCommand reserveProductCommand = ReserveProductCommand
.builder()
.orderId(orderCreatedEvent.getOrderId())
.productId(orderCreatedEvent.getProductId())
.quantity(orderCreatedEvent.getQuantity())
.userId(orderCreatedEvent.getUserId())
.build();
LOGGER.info("OrderCreatedEvent handled for orderId: " + reserveProductCommand.getOrderId() + " and productId: " + reserveProductCommand.getProductId());
commandGateway.send(reserveProductCommand, new CommandCallback<ReserveProductCommand, Object>() {
@Override
public void onResult(CommandMessage<? extends ReserveProductCommand> commandMessage, CommandResultMessage<?> commandResultMessage) {
if (commandResultMessage.isExceptional()){
}
}
});
}
@SagaEventHandler(associationProperty = "orderId")
public void handle(ProductReservedEvent productReservedEvent){
LOGGER.info("ProductReservedEvent is called for productId: " + productReservedEvent.getProductId() + " and orderId: " + productReservedEvent.getOrderId());
}
}
低于OrderCreatedEvent
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderCreatedEvent {
public String orderId;
private String userId;
private String productId;
private int quantity;
private String addressId;
private OrderStatus orderStatus;
}
我看到axon dashboard OrderCreatedEvent已经在那里发布了
我认为问题是Axon在Saga上需要一个无arg构造函数。您应该使用字段注入来获取资源。参考指南中的这一段解释了这一点:
SpringResourceInjector使用Spring的依赖注入机制将资源注入到传奇中。这意味着您可以根据需要使用setter注入或直接字段注入。需要对要注入的方法或字段进行注释,以便Spring将其识别为依赖项,例如使用@Autowired。
文章可以在这里找到:https://docs.axoniq.io/reference-guide/axon-framework/sagas/implementation.将构造函数注入更改为字段注入,如以下示例所示,应该适合您:
@Saga
public class OrderSaga {
@Autowired
private final transient CommandGateway commandGateway;
private static final Logger LOGGER = LoggerFactory.getLogger(OrderSaga.class);
// Abbreviated for clarity
}
我正在尝试制作一个计时器编程,它将一个变量添加到一个变量中,然后每秒钟将其输出到JTextField。然而,我似乎无法获得启动计时器并使其继续运行的按钮。它总是添加一个,但随后退出。我如何使它每当我按下开始按钮时,计时器就开始计数,直到我按下停止? 我是stackoverflow的新手,所以请排除任何不正确的格式
我读过发电机不会等待promise。为什么< code>redux-saga中的生成器不是这种情况,我如何让自己的生成器等待? 例如,这个故事: 将输出: 而不是:
背景: 如下图所示,图的左边有一个无向图。顶点由S2的S1表示...S6,并且边由顶点之间的线段表示。每条边都有一个权重(边附近的数字),可以是正的,也可以是负的。 定义: 在图中,如果一个简单的循环有奇数条负边,则称为冲突循环,如果一个偶数(或零)条负边,则称为一致循环。在下图的左侧,例如,该图有两个冲突循环(S1-S2-S3-S1和S2-S3-S4-S2),其他循环是一致的。如果一个图没有冲突
我将不折不扣地学习以下教程:https://www.rabbitmq.com/tutorials/tutorial-two-java.html。 我以这样的方式启动RabbitMQ服务器: 我生成了两个消费者,当我Ctrl+C其中一个时,另一个正在运行的消费者不会接收到最初发往前一个消费者的消息。如何在Ctrl+C'ing从一个消费者中重新传递消息? 编辑:我现在正在通过'brew'安装Rabbi
我使用的是Jersey 1.12,并且有一个endpoint可能接收也可能不接收来自我无法控制的客户端的格式错误的标头(例如)。显然,bla格式错误,因为规范要求参数也要有值,即 我可以按照这里、这里和这里的建议编写一个过滤器来解决这个问题,但我想知道是否有一种方法可以让Jersey在我对其值不感兴趣的情况下忽略所有格式错误的报头?