2014-03-19 149 views
1

我们有以下情形,我们希望使用Apache的骆驼来解决:骆驼INOUT很长的响应时间

异步请求到达时在骆驼配置的AMQP端点。该消息包含应该用于响应的答复的标题属性。 Camel必须使用JMS将此消息传递给另一个服务,然后将响应从AMQP请求发送回应答队列。这看起来像是在骆驼中使用InOut功能的教科书示例,但是我们遇到了一个问题:JMS服务的回复可能需要很长时间,有些情况下可能需要几天。

据我所知,如果我们使用InOut,这意味着我们会锁定一个线程到长时间运行的服务。如果我们不幸,我们可能会同时发出几个长时间运行的呼叫,而在最坏的情况下,可能是所有线程都忙于等待回复,从而堵塞系统。

我应该使用什么策略来解决上述问题?目前,我已经创建了分隔路由:一个监听AMQP端点并将消息转发给JMS端点。其他路由监听jms系统的replyto-queue,并负责将回复发送回AMQP reply-to。我现在面临的问题是,我应该如何在这两条路线之间存储AMQP回复,并且我不确定这是否是针对此问题的总体解决方案。

有关如何解决此问题的任何提示或想法将不胜感激。

回答

1

如果您必须等待一分钟以上才能回复,则将回复视为异步可能是件好事。并创建单独的请求和响应路由。

由于您提到了几天,您甚至可能希望在应用程序重新启动(甚至是备份还原)中生存以关联响应。在这种情况下,您需要使用消息属性将关联信息存储在持久存储库(如数据库或JMS队列)中,然后使用选择器来检索关联信息。

我已经使用这两个队列和数据库长时间的请求/答复相关信息与成功。

在任何时候能够故障切换/重新启动服务器或应用程序始终是一种很好的做法,因为知道任何正在进行的处理都会在没有错误的情况下停止。

复杂性和性能都有成本,但是通常会考虑到性能的稳健性。

+0

谢谢你的回应。我们选择使用异步风格来解决这个问题,因为把它当作同步处理是没有意义的。 – P3anuts