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