Camel Netty4 вызывает бесконечный цикл обратной связи

Я пытаюсь добиться рукопожатия UDP с компонентом верблюда netty4. При получении приветственного сообщения приложение пометит флаг в приветственном сообщении как ACKed и отправит его обратно отправителю (processRoute).

Приведенный ниже маршрут таймера имитирует периодическое приветственное сообщение, отправляемое с UDP_REMOTE нашему приложению (UDP_LOCAL). И checkRoute проверяет, получено ли приветственное сообщение ACKed отправителем.

С приведенным ниже кодом похоже, что компонент вызывает бесконечный цикл обратной связи. Задействованы основные библиотеки: camel-spring-boot (2.16.1) и spring-boot (1.3.2.RELEASE). Я знаю, что это должно быть моя ошибка. Было бы здорово, если бы кто-нибудь показал мне правильный способ сделать это. Заранее спасибо.

    private static final String UDP_LOCAL = "netty4:udp://localhost:4466";
    private static final String UDP_REMOTE = "netty4:udp://localhost:8899";

    private static final AtomicInteger counter = new AtomicInteger();

    private final class PrintProcessor implements Processor {
        private final String name;

        public PrintProcessor(String name) {
            this.name = name;
        }

        @Override
        public void process(Exchange exchange) throws Exception {
            byte[] body = exchange.getIn().getBody(byte[].class);
            System.err.println(name + "\t[b]==>" + new String(body));
        }
    }

    @Bean
    public RouteBuilder RouteBuilder() {
        return new RouteBuilder() {

            @Override
            public void configure() throws Exception {
                from("timer://poller?period=5s").process(exchange -> {
                    exchange.getIn().setBody("Hello" + counter.incrementAndGet());
                    System.err.println("Sending Hello...");
                }).to(UDP_LOCAL);
                from(UDP_LOCAL).id("processRoute").process(new PrintProcessor("processRoute")).to(UDP_REMOTE);
                from(UDP_REMOTE).id("checkRoute").process(new PrintProcessor("checkRoute"));
            }
        };
    }

Лог выглядит так

Sending Hello...
processRoute    [b]==>Hello1
checkRoute  [b]==>Hello1
checkRoute  [b]==>Hello1
processRoute    [b]==>Hello1
checkRoute  [b]==>Hello1
checkRoute  [b]==>Hello1
processRoute    [b]==>Hello1
checkRoute  [b]==>Hello1
checkRoute  [b]==>Hello1
processRoute    [b]==>Hello1
...

person Lewis Wong    schedule 04.03.2016    source источник


Ответы (1)


Это связано с конфигурацией запроса/ответа компонента netty.

  1. «Локальный» получает сообщение, распечатывает его и отправляет «удаленному»
  2. «удаленный» получает сообщение, распечатывает его... и отправляет ответ источнику: который является «локальным»
  3. "local" получить сообщение... cf 1

Проверьте свойство sync на конечной точке, чтобы отключить ответ компонента netty.

private static final String UDP_LOCAL = "netty4:udp://localhost:4466?sync=false";
private static final String UDP_REMOTE = "netty4:udp://localhost:8899?sync=false";
person Jérémie B    schedule 04.03.2016
comment
Предложенные изменения работают, большое спасибо. У меня есть еще один вопрос по компоненту. Когда я пытаюсь отправить сообщение на порт 4466 через java UDPClient, camel-netty4 выдает TooLongFrameException. Я попытался использовать параметр allowDefaultCodec=false&udpByteArrayCodec=true, однако кажется, что сообщение не доходит до потребителя. Более того, TooLongFrameException вызвало закрытие порта 4466, поэтому последующие запросы вызывают PortUnreachableException. Есть намеки на это? - person Lewis Wong; 05.03.2016
comment
Только что обнаружил, что allowDefaultCodec=false&udpByteArrayCodec=true действительно работает, вместо установки тела в маршруте таймера в виде строки, просто установите его как byte[] с помощью exchange.getIn().setBody(body .getBytes()). Было бы неплохо, если бы я мог получить какое-то объяснение того, почему произошло TooLongFrameException. Ура~ - person Lewis Wong; 05.03.2016