我实现我自己的帧解码器来解析根据我们的协议,通过(使用NioDatagramChannelFactory和ConnectionlessBootstrap)UDP套接字接收的字节数“channelInterestChanged”事件。 为了跟踪接收消息时服务器中发生的事情,我在解码器的每个回调方法中添加了跟踪日志。不知道明白为什么我的服务器接收的帧解码器
似乎对于服务器接收几乎所有的消息时,我们可以看到,该事件“channelInterestChanged”在方法channelInterestChanged()接收到的两倍。事件的值首先是0(OP_NONE),然后是1(OP_READ)。
我读到这个文件,但我仍然不知道明白为什么我收到这样的事件。我第一通,这是因为接收缓冲器(或选择器队列)是满的,但是服务器接收到该事件的相同的次数它接收“的messageReceived”事件(解码之前()方法被调用)和所有的消息/帧如预期的那样正确解码。当消息丢失时,我根本没有看到任何事件。在这种情况下,可能是因为数据报套接字的接收缓冲区已满。但即使我增加了这个接收缓冲区,我仍然会看到这些事件并错过消息。
所以,我很奇怪,为什么对于每个接收邮件时,服务器还接收两个“channelInterestChanged”,一个与OP_NONE值和一个与OP_READ值。请注意,在通道管道中,在我的帧解码器之后,还有一个ExecutionHandler和另一个特定于业务的处理程序(它将JMS消息发送到ActiveMQ实例)。
任何想法或解释给我吗?
谢谢。
有兴趣知道的是我自己。为什么不尝试连接netty源并调试它,Netty有一个'fireEvent'方法,它将这些事件上行/下行发送到通道中。也许它来自java ** NIO选择器**本身,而Netty只是将它传输到帧解码器。 – Abe 2012-03-16 02:38:46