2012-05-04 54 views
0

當我收到一個新的請求時,我會把這個MessageEvent放到LinkedBlockingQueue; 另一個線程正在運行從此LinkedBlockingQueue讀取MessageEvent,所以我處理messageEvent並寫入客戶端。但是,當我寫入客戶端時,會發生異常。Netty ClosedChannelException當異步處理我收到的消息

這裏是我的代碼:

@Override 
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { 
    LogConsole.info(e.toString()); 
    messageReceivedQueue.addReceivedMessage(e); 
} 

public void run() { 
    MessageEvent e = messageReceivedQueue.get();  
    e.getChannel().write(e.getMessage()); 
} 

這裏是我得到的錯誤:

java.nio.channels.ClosedChannelException 
    at org.jboss.netty.channel.socket.nio.NioWorker.cleanUpWriteBuffer(NioWorker.java:645) 
    at org.jboss.netty.channel.socket.nio.NioWorker.writeFromUserCode(NioWorker.java:372) 
    at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.handleAcceptedSocket(NioServerSocketPipelineSink.java:137) 
    at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.eventSunk(NioServerSocketPipelineSink.java:76) 
    at org.jboss.netty.channel.Channels.write(Channels.java:632) 
    at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:70) 
    at org.jboss.netty.channel.Channels.write(Channels.java:611) 
    at org.jboss.netty.channel.Channels.write(Channels.java:578) 
    at org.jboss.netty.channel.AbstractChannel.write(AbstractChannel.java:251) 
    at com.bankht.cis.tcs.service.executor.adapter.AbstractMessageAdapter$ProcessWorker.run(AbstractMessageAdapter.java:97) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

回答

0

這告訴你的是,信道在此期間關閉。關於這一點你可以做得不多,因爲客戶可能會一直關閉套接字。

+0

thks,你是對的。我發現這個頻道在我寫給客戶之前就已經關閉了。但是當我使用messageReceived方法寫入客戶端時,它將成功發送給客戶端。我很困惑。像這樣@Override public void messageReceived(ChannelHandlerContext ctx,MessageEvent e){e.getChannel()。write(「resp:」+ e.getMessage()。toString()); } – kevin

相關問題