Как получить данные из очереди seda в компонентном декодере netty4 - PullRequest
0 голосов
/ 09 июня 2019

Я новичок в netty и camel и пытаюсь создать прокси, используя apache camel и его компонент netty4.

Я хочу получить данные с сервера, переслать эти данные в очередь seda, а затем отправить эти данные из очереди seda на другой сервер, для которого сначала необходимо выполнить квитирование.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что при попытке добавить пользовательский кодер / декодер я никогда не получаю данные из очереди seda в методе channelRead при расширении ChannelInboundHandlerAdapter

До сих пор я пробовал без декодера / кодера, и данные пересылаются по маршрутам и принимаются на сервере назначения, но не при добавлении декодера к компоненту 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");

    }
}

Я ожидаю, что данные будут перетекать с первого маршрута netty в очередь seda. Затем из очереди seda в компонент netty назначения, где сначала выполняется рукопожатие внутри пользовательского декодера перед отправкой полученных данных. Любая помощь будет принята с благодарностью.

...