我有一個Camel應用程序,它使用netty組件通過TCP與遠程服務器進行通信。服務器有掛起的傾向,所以我希望能夠在請求上添加可配置的超時,以便如果在X時間內沒有返回響應,我會得到一個異常。在Camel中使用Netty實現請求超時
微型組件在timeout
參數中具有此功能,但netty組件似乎沒有相應的選項。
我試着用ReadTimeoutHandler
完成這個,而且接近...但不完全。它首先初始化CamelContext
當創建HashedWheelTimer
:
HashedWheelTimer timer = new HashedWheelTimer();
JndiRegistry jndi = new JndiRegistry();
jndi.bind("MyClientPipelineFactory", new MyClientPipelineFactory(timer));
然後將其添加到我的管道:
public class MyClientPipelineFactory extends ClientPipelineFactory
{
private final Timer timer;
public MyClientPipelineFactory(Timer timer) {
this.timer = timer;
}
public ChannelPipeline getPipeline(NettyProducer producer) throws Exception
{
ChannelPipeline p = pipeline();
p.addLast("timeout", new ReadTimeoutHandler(timer, 30));
// more stuff
return p;
}
}
最後,我捕獲任何異常,我的路由配置:
onException(ReadTimeoutException.class)
.handled(true)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
Exception exception = (Exception) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
throw new ApplicationException("Connection timed out", exception);
}
});
這幾乎可行。不幸的是,它是通道特定的,而不是特定的請求。所以只要我與服務器通信,我很好。但在完成30秒後,我得到一個ReadTimeoutException
引發。問題在於它正在尋找線路上的任何活動,而不是我關心的請求/響應對。
我在這裏錯過了什麼嗎?有使用Camel + Netty做請求超時的固有方式,或者有什麼方法可以使ReadTimeoutException
工作?
(駱駝2.9.2/3.3.1的Netty)