当前位置: 首页 > 知识库问答 >
问题:

如何让传奇开始

胡意致
2023-03-14

我正在尝试使用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已经在那里发布了

共有1个答案

欧阳斌
2023-03-14

我认为问题是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在我对其值不感兴趣的情况下忽略所有格式错误的报头?