1

在我的 NettySimpleChannelUpstreamHandler中,当我收到一条消息时,我需要启动与另一个 Netty 服务器的连接并转发消息。但是,在启动第二个连接时,我使用:

ChannelFuture channelFuture = clientBootstrap.connect(new InetSocketAddress(host, port));
hannelFuture.awaitUninterruptibly();

这会导致以下错误:

java.lang.IllegalStateException: await*() in I/O thread causes a dead lock or sudden performance drop. Use addListener() instead or call await*() from a different thread.
    at org.jboss.netty.channel.DefaultChannelFuture.checkDeadLock(DefaultChannelFuture.java:314)
    at org.jboss.netty.channel.DefaultChannelFuture.awaitUninterruptibly(DefaultChannelFuture.java:226)
    at com.my.NettyClient.start(NettyClient.java:204)
  ....
  at com.my.MyChannelUpstreamHandler.messageReceived(MyChannelUpstreamHandler.java:52)

开始第二次连接的最佳方式是什么?我应该执行以下操作吗?:

    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {

        ExecutorService executorService = Executors.newSingleThreadExecutor();

        executorService.submit(new Runnable() {

            @Override
            public void run() {
                // Connect to another Netty Server...

                // Forward on message...
            }
        });

        executorService.shutdown();
...

在收到的每条消息上启动一个新线程是否浪费?

4

1 回答 1

1

查看代理示例以了解如何在不阻塞的情况下执行此操作:

http://netty.io/docs/stable/xref/org/jboss/netty/example/proxy/HexDumpProxyInboundHandler.html

于 2012-05-30T15:11:38.570 回答