1

我有两个应用程序,一个使用带有 Netty 组件的 Camel 发送 UDP 消息,另一个使用 DatagramChannel 在 Java NIO 中接收 UDP 消息。

接收数据时,我注意到在我的消息前面附加了一个额外的 29 个字节。Netty Camel 打印出传出的字节,看起来不错,但是当我在另一侧收到消息后立即执行 packet.getData() 时,它的前面有额外的东西(而且总是相同的字节)。

Camel 或 Netty 是在发送之前包装数据包吗?

[编辑] 附加信息:

-Camel 正在打印日志语句,而不是 Netty
-消息内容更改时,消息前面的字节会更改(仅更改两个字节)

4

1 回答 1

0

我知道这个问题现在已经很老了,但我正好遇到了这个问题,我花了一段时间才找到解决方案。所以这里...

基本上问题归结为当你告诉camel-netty在UDP数据包中发送足够低级别的东西(如字节[])时会做什么的混淆。我希望像我一样,OP 假设他们正在设置原始数据,但是 camel-netty 默认使用 Java 对象序列化 - 导致那些额外的“随机”字节出现在预期数据之前。

解决方案是更改相关端点使用的编码器/解码器。有各种内置的替代品,但如果你需要更多……奇怪的东西,你可以对它们进行子类化。无论哪种方式,过程是:

1) 将适当的“encoder=#myEncoder”和“decoder=#myDecoder”选项添加到端点 URI。例如

String destinationUri = "netty:udp://localhost:4242"
        + "?sync=false&encoder=#myEncoder";

2)添加从“myEncoder”到新编码器类实例的映射到骆驼注册表。myDecoder 也一样。然后在构造 CamelContext 时使用该注册表。例如

SimpleRegistry registry = new SimpleRegistry();
registry.put("myEncoder", new StringEncoder());
registry.put("myDecoder", new StringDecoder());
CamelContext camelContext = new CamelContext(registry);

显然,真正的诀窍在于找到或制作适合您需求的编码器/解码器。znetdevelopment上的一篇博文确实帮助了我,尽管它更进一步并将自定义编码器放入自定义管道中(我忽略了这一点)。

于 2014-01-21T21:51:10.037 回答