2012-10-25 70 views
0

我有一個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)

回答

1

我不熟悉的駱駝,但一個快速瀏覽一下米娜和Netty的成分表明,所需要的功能是米娜組件的功能,而不是Mina,並且它從Netty組件中缺失。在駱駝行李箱中,Mina生產者具有代碼路徑,用於同步爲真時,而Netty生產者似乎沒有類似的功能。可能值得將問題提交給駱駝郵件列表。

可能的解決方法是創建一個自定義的Netty處理程序,它是請求/響應感知的,因此您的管道中有一個處理程序,可在請求發送時啓動計時器,並在收到響應時取消計時器。

0

我想知道是否可以爲此添加某種支持。在給定的交換請求/回覆對上觸發超時。

我認爲ReadTimeoutHandler是來自Netty?我想我們可以在代碼中達到頂峯,看看我們是否只能在觸發「飛行中」的情況下觸發它。

一個技巧也是如何處理,如果答覆稍後回來,並且超時已經觸發。然後駱駝需要處理這個取消處理回覆。我不確定這是否容易做到。