Apache camel Camel Netty4导致了无限反馈循环
我正在尝试使用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)。我知道那一定是我的错。如果有人能告诉我正确的方法那就太好了。提前谢谢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
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";
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发生的原因,那就太好了。干杯~