我目前正在开发一个Camel Integration应用程序,其中从以前的处理状态恢复很重要。例如,当停电时,重新处理所有先前处理的消息非常重要。处理应该从中断之前的中断处恢复。
我已经完成了许多可能的解决方案,包括Terracotta和Apache Shiro。我不知道如何使用它作为与Apache Camel集成的文档很少。但是,我还没有确定这两个。
我正在寻找关于我可以使用的潜在替代方案的建议,或者指向一些教程来启动我。
答案 0 :(得分:2)
幸存中断的困难主要在于状态,以及如何处理飞行中的消息。
通常,当您在路由中谈论状态时,解决方案是将其刷新到磁盘或群集中的其他节点。以聚合器模式为例,聚合状态持久存储在聚合存储库中。默认实现在内存中,因此如果断电,则所有状态都将丢失。但是,还有其他实现,包括一个用于JDBC,另一个使用Hazelcast(轻量级内存数据网格)。我自己没有使用过Hazelcast,但JDBC会对磁盘进行同步写入。聚合器模式允许您从中断的位置继续。幂等消费也存在类似的解决方案。
关于飞行中消息的第二个问题有点复杂,很大程度上取决于你消费的地方。如果您正在处理Web服务请求,并且电源耗尽,那么丢失消息是否重要?用户可以简单地重试。对外部系统的任何影响都可以包含在事务中,也可以包含在具有JDBC幂等存储库的幂等使用者中。
如果要构建基于消息传递的集成,则应在事务中使用,这样,如果服务器出现故障,消息将返回到代理,并可以重播给其他消费者。
使用seda:
或threads
块时要小心,这些块使用内存中队列来传递线程之间的交换,如果有人绊倒电源,那么流向这些路由的任何消息都将丢失电缆。如果您无法承受消息丢失,并且需要这种处理模型,请考虑使用JMS队列作为两条路由之间的端点(使用事务来确保从上次停止的地方获取)。