1

我想知道骆驼/网络环境中的连接状态。

为此,我尝试了这样的事情:

  • 指定了我的骆驼路线
    from("direct:in").marshal().serialization()
    .to("netty:tcp://localhost:42123?clientPipelineFactory=#cpf&sync=false");
  • 实现了我的管道工厂
    public class ConnectionStatusPipelineFactory extends ClientPipelineFactory {
        @Override
        public ChannelPipeline getPipeline() throws Exception {
            ChannelPipeline cp = Channels.pipeline();
            cp.addLast("statusHandler", new ConnectionStatusHandler());
            return cp;
        }

        @Override
        public ClientPipelineFactory createPipelineFactory(NettyProducer producer) {
            return new ConnectionStatusPipelineFactory();
        }
    }
  • 实现了我的连接状态处理程序
    public class ConnectionStatusHandler extends SimpleChannelUpstreamHandler {
        @Override
        public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
                throws Exception {
            System.out.println("Event: " + e);
            super.channelConnected(ctx, e);
        }

        @Override
        public void channelDisconnected(ChannelHandlerContext ctx,
                ChannelStateEvent e) throws Exception {
            System.out.println("Event: " + e);
            super.channelDisconnected(ctx, e);
        }
    }

最后在我的骆驼注册表中将“ConnectionStatusPipelineFactory”绑定到“cpf”。

但是出现了以下异常:

java.lang.IllegalArgumentException: unsupported message type: class [B

评论:

  • “channelConnected”和“channelDisconnected”方法按预期调用。
  • 当我禁用它时,一切正常(消息编组、连接、远程进程......)。

问题是:

  • 那有什么问题?
  • 这是了解连接状态(连接与否)的好方法吗?
4

1 回答 1

0

尝试使用解码器选项而不是整个客户端管道工厂。例如使用选项decoder=#myConnectionStatusHandler。然后使用名称 myConnectionStatusHandler 在注册表中注册您的 ConnectionStatusHandler。

如果您使用管道工厂,那么您需要添加 Camel 开箱即用的所有其他内容。

于 2013-09-03T15:11:37.153 回答