我们希望使用Apache Camel解决以下场景:
异步请求到达Camel中配置的AMQP端点。此消息包含应用于响应的回复的标头属性。 Camel必须使用JMS将此消息传递给另一个服务,然后将响应从AMQP请求路由回到回复队列。这似乎是在Camel中使用InOut功能的教科书示例,但我们有一个问题:来自JMS服务的回复可能需要很长时间,在某些情况下需要几天。
据我了解,如果我们使用InOut,则意味着我们会将一个线程锁定到长时间运行的服务。如果我们运气不好,我们可以同时获得几个长时间运行的呼叫,在最坏的情况下,可能是所有线程都忙于等待回复,从而堵塞系统。
我应该采用什么策略来解决上述问题?目前,我创建了分离路由:一个侦听AMQP端点并将消息转发到JMS端点。另一条路由侦听jms系统的replyto-queue,并负责将回复发送回AMQP回复。我现在遇到的问题是我应该如何在这两条路线之间存储AMQP回复,我不确定这是一个很好的解决方案。
非常感谢有关如何解决此问题的任何提示或想法。
答案 0 :(得分:1)
如果您需要等待超过一分钟的回复,将回复视为异步可能是一件好事。并创建单独的请求和响应路由。
由于您提到了几天,您甚至可能希望在应用程序重新启动(甚至备份还原)后继续存在以关联响应。在这种情况下,您需要使用消息属性将相关信息存储在持久性存储(如数据库或JMS队列)中,并使用选择器来检索相关信息。
我已经成功地使用了队列和数据库来获取长时间的请求/回复相关信息。
能够在任何时候故障转移/重新启动服务器或应用程序,并且知道任何正在进行的处理将在没有错误的情况下停止的地方,这是一个很好的做法。
复杂性和性能需要成本,但通常会提高性能。