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