Apache camel Camel Netty4导致了无限反馈循环

Apache camel Camel Netty4导致了无限反馈循环,apache-camel,netty,Apache Camel,Netty,我正在尝试使用camel netty4组件实现UDP握手。在接收hello消息的过程中,应用程序会将hello消息中的一个标志标记为ACKed,并将其发送回发起人(processRoute) 下面的计时器路由模拟从UDP_REMOTE发送到我们的应用程序(UDP_LOCAL)的周期性hello消息。checkRoute检查发起者是否接收到确认的hello消息 在下面的代码中,组件似乎导致了无限反馈循环。涉及到的核心lib是camel-springboot(2.16.1)和springboot(1

我正在尝试使用camel netty4组件实现UDP握手。在接收hello消息的过程中,应用程序会将hello消息中的一个标志标记为ACKed,并将其发送回发起人(processRoute)

下面的计时器路由模拟从UDP_REMOTE发送到我们的应用程序(UDP_LOCAL)的周期性hello消息。checkRoute检查发起者是否接收到确认的hello消息

在下面的代码中,组件似乎导致了无限反馈循环。涉及到的核心lib是camel-springboot(2.16.1)和springboot(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
...

它与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";
  • “本地”接收消息,打印并发送到“远程”
  • “远程”接收消息,打印它。。。并将响应发送到源:即“本地”
  • “本地”收到一条消息。。。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";
    

    建议的更改有效,非常感谢。我还有一个关于组件的问题。当我试图通过java UDPClient向端口4466发送消息时,camel-netty4抛出TooLongFrameException。我尝试使用选项allowDefaultCodec=false&udpByteArrayCodec=true,但是消息似乎没有到达使用者。除此之外,TooLongFrameException导致端口4466关闭,因此后续请求会抛出PortUnreachableException。有什么提示吗?刚刚发现allowDefaultCodec=false&udpByteArrayCodec=true实际上可以工作,而不是将计时器路由中的主体设置为字符串,只需使用exchange.getIn().setBody(body.getBytes())将其设置为byte[]。如果我能解释一下TooLongFrameException发生的原因,那就太好了。干杯~