2011-12-07 61 views
0

我的服務器上有一個處理程序,它正在查找傳入消息的特定實例,並且在它到達時處理程序設置了內部屬性。由於我沒有進一步使用傳入消息,因此我不想將其發送到管道的其餘部分,因此我只是從messageReceived()方法返回。如何消費一條消息而不轉發給管道的其餘部分

@Override 
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { 
    if (e.getMessage() instanceof StartTimerCommand) { 
     trigger.getAndSet(true); 
     return; 
    } 

    ctx.sendUpstream(e); 
} 

這似乎有阻塞我的管道,因爲沒有更多的消息從客戶端收到的效果。當我沒有進一步使用它們時,我該如何丟棄不需要的消息?

問候

+0

我沒有看到您的代碼有任何問題。也許別的什麼是錯的? – trustin

+0

有問題的處理程序在9個處理程序的管道中是6號。使用上面列出的處理程序,在接收到StartTimerCommand之後不再處理消息。如果我刪除「返回」並更改處理程序7,8和9來處理StartTimerCommand,那麼一切都按預期工作。 – user497087

+0

您確定您在第一個「StartTimerCommand」之後收到的消息不是「StartTimerCommand」嗎?如果您可以通過提供一個小樣本應用程序並在問題跟蹤器中提出問題來幫助我們重現問題,那將非常棒。 – trustin

回答

-2

試試這個:

@Override 
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { 
    if (e.getMessage() instanceof StartTimerCommand) { 
     trigger.getAndSet(true); 
    } 
    else { 
     ctx.sendUpstream(e); 
    } 
} 

在虛空方法使用「返回」看起來恕我直言怪/混淆

+1

從描述中,它聽起來像偶處理機制被丟棄並停止處理事件。你提出的改變看起來功能上相同。此代碼是否會改變解決海報問題? – ahoffer

+0

這個答案對這個問題沒有用處。 – Vincent

0

當你重寫信息接收方法,你把轉發的責任消息在鏈中。所以如果你不明確地做,你的消息會被消耗掉。

當你需要轉發你的信息,請致電:

super.messageReceived(ctx, e) 

否則該信息將不被轉發,這是你想要的。

相關問題