1

NettySimpleChannelUpstreamHandlerでメッセージを受信すると、別の Netty サーバーへの接続を開始し、メッセージを転送する必要があります。ただし、この 2 番目の接続を開始するときは、次を使用します。

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)

この 2 番目の接続を開始する最良の方法は何ですか? 次のことを行う必要がありますか?:

    @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 に答える