2013-04-26 17 views
1

我有两个应用程序,一个使用Camel和Netty组件发送UDP消息,另一个使用DatagramChannel在Java NIO中接收UDP消息。在Camel/Netty中发送UDP并在NIO中接收额外的字节

当我收到数据时,我注意到我的邮件正面还有一个额外的29个字节。 Netty骆驼打印输出的字节,它看起来很好,但是当我做一个packet.getData(),一旦消息进入另一边,它有额外的东西在前面(它总是相同的字节)。

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

[编辑]其他信息:

-Camel正在打印日志语句,而不是的Netty
-the字节预谋到消息时变化的信息的内容改变(只有两个字节被改变)

回答

0

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

基本上,这个问题归结为当你告诉它发送一个足够低级别的数据时,camel-netty会做什么,就像在UDP数据包中发送一个字节[]一样。我希望像我一样,OP认为他们正在设置原始数据,但camel-netty默认使用Java Object Serialization - 导致在预期数据之前出现额外的“随机”字节。

解决方案是更改相关端点使用的编码器/解码器。有各种内置的选择,但如果你需要更奇怪的东西,你可以继承它们。无论哪种方式,过程如下:

1)根据需要在端点URI上添加“encoder =#myEncoder”和“decoder =#myDecoder”选项。例如

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的博客文章确实对我有所帮助,尽管它更进一步,并将自定义编码器放入自定义管道(我忽略了这一点)。

+0

感谢您的回答!很好,终于找出它在底下做了什么。我们结束了双方纯粹的NIO,因为我们发现camel-netty实现对我们的需求来说太慢了。 – mdnghtblue 2014-01-27 18:50:02