在Camel / Netty中发送UDP并在NIO中接收额外的字节

时间:2013-04-26 18:05:08

标签: java netty apache-camel

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

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

Camel或Netty是否在发送数据包之前将其包裹起来?

[edit]其他信息:

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

1 个答案:

答案 0 :(得分:0)

我知道这个问题现在很老了,但我确实遇到了这个问题,我花了一些时间才找到解决方案。所以这就是......

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

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

1)根据需要将“encoder =#myEncoder”和“decoder = #myDecoder”选项添加到端点URI。 e.g。

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

2)将“myEncoder”的映射添加到新的Encoder类的实例到Camel Registry。 myDecoder也一样。然后在构造CamelContext时使用该注册表。 e.g。

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

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