2013-05-01 93 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