2013-05-01 88 views
2

我正在使用返回来自另一个进程的结果的Camel代理。在20000毫秒等待回复消息后发生骆驼JMS代理超时

public interface DataProcessingInterface { 
    public List<ResponseData> processPreview(ClientData criteria, Config config); 
} 

,这是配置的链路这

<camel:proxy 
id="processPreviewProxy" 
serviceInterface="model.jms.DataProcessingInterface" 
serviceUrl="jms:queue:processPreview"/> 

但有时其他过程需要很长时间才能返回结果,我有得到超时异常

TemporaryQueueReplyManager - Timeout occurred after 20000 millis waiting for reply message with correlationID [Camel-ID-PC01-2661-1367403764103-0-15]. Setting ExchangeTimedOutException on (MessageId: ID-PC01-2661-1367403764103-0-17 on ExchangeId: ID-PC01-2661-1367403764103-0-16) and continue routing. 

怎么办我告诉骆驼等到响应准备就绪。如果这需要多长时间,它应该永远持续下去。客户端在不同的线程中进行管理,因此它所花费的时间不会影响客户端。

也有可能重新建立连接如果TimeoutException被抛出,所以我可以继续等待?

回答

2

“永远”?不,你不能永远等下去。

(同步)请求/回复通常会有一个由原因设置的超时值。如果您在给定时间内未收到回复,请重试或跳过。在JMS的情况下,你设置requestTimeout和timeToLive来实现这一点。阅读this部分。在骆驼中,您可以通过重新传递和错误处理程序来实现这些目标。无论如何,如果你将值设置为“永远”(或者至少很长,如多个小时) - 那么服务器/应用程序重新启动仍然会使请求失败。

+0

感谢您的反馈意见。我认为“永远”是“不是一个好策略”。我将结合超时与ExceptionHandler再次重试请求。比永远等待更聪明多了。 tx – 2013-05-02 08:48:55

+1

对于“服务器/应用程序重新启动仍然会使请求失败”+1。 – techuser 2013-05-02 13:46:02

1

您可以在jms端点上设置非常高的请求超时。

jms:queue:processPreview?requestTimeout=xxxx 
+0

高请求超时很少是一个好主意 – 2016-01-20 12:21:00