骆驼重置时执行最后一个状态

问题描述 投票:0回答:1

如果我们定义一条路由,包含调用多种服务,比如订餐服务,其中包含调用厨房服务、计费服务、送餐服务。

现在,如果调用厨房服务,但调用第二个服务时骆驼会重置

如何从之前的状态开始运行记账服务?

我们正在使用 Spring Boot、Camel、Seda 组件

正常情况下,如果使用seda组件,工作就可以正确完成

spring-boot apache-camel seda
1个回答
0
投票

要处理 Apache Camel 应从服务工作流程中停止的位置(由于重置)继续处理的情况,您可以利用 Camel 对持久消息队列和幂等消费者的支持,并在以下情况下设置适当的事务管理:需要。您提到的 SEDA 组件可以处理异步调用,但不提供开箱即用的持久性。

以下是使用 Apache Camel 和 Spring Boot 实现恢复状态的策略:

使用持久队列和幂等性

持久消息队列:不要使用 SEDA,而是考虑使用支持持久性的 Camel 组件,例如 JMS 或 ActiveMQ。这些组件可以将消息存储在持久队列中,并且在重新启动后仍然存在。

使用ActiveMQ的示例:

from("activemq:queue:orderServiceQueue")
    .to("bean:kitchenService")
    .to("bean:accountingService")
    .to("bean:deliveryService")
    .end();

幂等消费模式:

这确保了即使消息在重启后重新传递,也不会被多次处理,这对于避免重复事务至关重要。

将幂等存储库与数据库结合使用的示例:

from("activemq:queue:orderServiceQueue")
    .idempotentConsumer(header("messageId"), 
         JdbcMessageIdRepository.jdbc(dataSource, "messageStore")) 
    .to("bean:kitchenService")
    .to("bean:accountingService")
    .to("bean:deliveryService")
    .end();

实施交易管理

为了确保在发生故障时调用所有服务或不调用任何服务,请将您的路由包装在事务中。

from("activemq:queue:orderServiceQueue")
   .transacted()
   .to("bean:kitchenService")
   .to("bean:accountingService")
   .to("bean:deliveryService")
   .end();
© www.soinside.com 2019 - 2024. All rights reserved.