2012-03-14 59 views
1

我实现我自己的帧解码器来解析根据我们的协议,通过(使用NioDatagramChannelFactory和ConnectionlessBootstrap)UDP套接字接收的字节数“channelInterestChanged”事件。 为了跟踪接收消息时服务器中发生的事情,我在解码器的每个回调方法中添加了跟踪日志。不知道明白为什么我的服务器接收的帧解码器

似乎对于服务器接收几乎所有的消息时,我们可以看到,该事件“channelInterestChanged”在方法channelInterestChanged()接收到的两倍。事件的值首先是0(OP_NONE),然后是1(OP_READ)。

我读到这个文件,但我仍然不知道明白为什么我收到这样的事件。我第一通,这是因为接收缓冲器(或选择器队列)是满的,但是服务器接收到该事件的相同的次数它接收“的messageReceived”事件(解码之前()方法被调用)和所有的消息/帧如预期的那样正确解码。当消息丢失时,我根本没有看到任何事件。在这种情况下,可能是因为数据报套接字的接收缓冲区已满。但即使我增加了这个接收缓冲区,我仍然会看到这些事件并错过消息。

所以,我很奇怪,为什么对于每个接收邮件时,服务器还接收两个“channelInterestChanged”,一个与OP_NONE值和一个与OP_READ值。请注意,在通道管道中,在我的帧解码器之后,还有一个ExecutionHandler和另一个特定于业务的处理程序(它将JMS消息发送到ActiveMQ实例)。

任何想法或解释给我吗?

谢谢。

+0

有兴趣知道的是我自己。为什么不尝试连接netty源并调试它,Netty有一个'fireEvent'方法,它将这些事件上行/下行发送到通道中。也许它来自java ** NIO选择器**本身,而Netty只是将它传输到帧解码器。 – Abe 2012-03-16 02:38:46

回答

0

当DownStreamChannelStateEvent从处理器发射(如呼叫channel.setReadable()channel.setWriteable()),该事件将改变NioDatagramWorker通道的NIO选择键的兴趣选择,后来,一个UpstreamChannelStateEvent将有改变的选项解雇(即OP_READOP_NONE

你的帧解码器处理程序接收UpstreamChannelStateEvents因为,在管道的一些其他处理程序改变通道的阅读兴趣选项(调用channel.setReadable/setWriteable的目的,节流读/写,以避免在应用堵塞,OutOfMemoryError )。

如果您的流水线中有任何MemoryAwareThreadPoolExecutor(它监视所用通道内存的大小),它可能会在任何时候通过调用channel.setReadable()来暂停或恢复读取,如果通道接收消息太快。您可能必须使用最佳的maxChannelMemorySize,maxTotalMemorySize配置MATPE实例,或者通过将其设置为0来禁用它。

+0

非常感谢您对这些非常清晰的解释!是的,我的管道中有一个MATPE,并且是有为内存大小设置的特定值。在我将这些参数设置为零后,我有效地注意到事件停止被触发。但直到现在,我真的不确定明白为什么,究竟是如何在发动机罩下工作的! – The4Summers 2012-03-18 13:43:49

相关问题