如何在Netty4组件解码器中从Seda队列接收数据

时间:2019-06-09 01:33:27

标签: java apache-camel netty

我是netty和camel的新手,正在尝试使用apache camel及其netty4组件创建代理。

我想从服务器接收数据,将数据转发到seda队列,然后将其从seda队列发送到另一台需要先执行握手的服务器。

我现在遇到的问题是,当我尝试添加自定义编码器/解码器时,在扩展ChannelInboundHandlerAdapter时,我从未从channelRead方法中的seda队列接收数据

到目前为止,我已经尝试过不使用解码器/编码器,并且通过路由转发数据并在目标服务器上接收数据,但是当将解码器添加到目标服务器netty组件时则不会。

NettyCamelPractice.java

public class NettyCamelPractice {

    public static void main(String args[]) throws Exception {
        Main camelMain = new Main();

        try {
            camelMain.getOrCreateCamelContext();
            camelMain.bind("testDecoderHandler", new TestDecoderHandler());
            camelMain.addRouteBuilder(new NettyCamelPracticeRouteBuilder());

            camelMain.run();
        } finally {
            camelMain.shutdown();
        }
    }
}

NettyCamelPracticeRouteBuilder.java

public class NettyCamelPracticeRouteBuilder extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        testRoute();
        sedaQueue();
    }

    public void testRoute() {
        System.out.println("here");
        from("netty4:tcp://127.0.0.1:1234?clientMode=true&textline=true")
                .to("seda:tmp_queue");

    }

    public void sedaQueue() {
        from("seda:tmp_queue")
                .log(LoggingLevel.INFO, "Got the message - ${body}")
                .to("netty4:tcp://127.0.0.1:5678?textline=true&decoder=#testDecoderHandler");
    }
}

TestDecoderHandler.java

public class TestDecoderHandler extends ChannelInboundHandlerAdapter {

    private Logger logger = LogManager.getLogger(TestDecoderHandler.class);

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {

        Channel inboundChannel = ctx.channel();

        logger.info("ChannelActive");
        ctx.writeAndFlush("ACK");
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {

        logger.info("ChannelRead");

        ByteBuf msgBuf = (ByteBuf) msg;

        String message = msgBuf.toString(CharsetUtil.UTF_8);

        logger.info(message);


    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        logger.info("ChannelReadComplete");

    }
}

我希望数据从第一条网络路线流向seda队列。然后从seda队列到目标净值组件,在此首先在自定义解码器内执行一次握手,然后发送接收到的数据。任何帮助将不胜感激。

0 个答案:

没有答案