org.jboss.netty.handler.queue
类 BlockingReadHandler<E>

java.lang.Object
  继承者 org.jboss.netty.channel.SimpleChannelUpstreamHandler
      继承者 org.jboss.netty.handler.queue.BlockingReadHandler<E>
类型参数:
E - 接受消息的类型
所有已实现的接口:
ChannelHandler, ChannelUpstreamHandler

public class BlockingReadHandler<E>
extends SimpleChannelUpstreamHandler

模拟缓冲读操作.该处理器存储所有接收到的消息到一个BlockingQueue并当read()read(long, TimeUnit)readEvent()readEvent(long, TimeUnit)方法被调用时返回这些消息.

请注意该处理器只有在很少的连接时候才有用,如测试和简单的客户端应用程序开发.

还有,任何在该处理器后面的处理器打都不会接收到 messageReceivedexceptionCaughtchannelClosed事件,因此它必须放在管道的最后.

这里有个演示用法的例子:

 BlockingReadHandler<ChannelBuffer> reader =
         new BlockingReadHandler<ChannelBuffer>();
 ChannelPipeline p = ...;
 p.addLast("reader", reader);
 
 ...
 
 // 在阻塞方式下从一个通道里读取一个消息.
 try {
     ChannelBuffer buf = reader.read(60, TimeUnit.SECONDS);
     if (buf == null) {
         // 连接已关闭.
     } else {
         // 这里处理接收到的消息.
     }
 } catch (BlockingReadTimeoutException e) {
     // 读取超时.
 } catch (IOException e) {
     // 其他读取错误
 }
 


嵌套类摘要
 
从接口 org.jboss.netty.channel.ChannelHandler 继承的嵌套类/接口
ChannelHandler.Sharable
 
构造方法摘要
BlockingReadHandler()
          使用默认非绑定的BlockingQueue实现创建一个新实例.
BlockingReadHandler(java.util.concurrent.BlockingQueue<ChannelEvent> queue)
          使用指定的BlockingQueue创建一个新实例.
 
方法摘要
 void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e)
          当一个Channel被关闭且它所有关联的资源被释放时调用.
 void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
          当一个I/O线程或ChannelHandler抛出异常时被调用.
 boolean isClosed()
          只有当关联该处理器的Channel已经关闭才返回true.
 void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
          当一个从远端发来的消息对象(如: ChannelBuffer)被接收时调用.
 E read()
          等待直到一个新的消息被接收或关联的Channel被关闭.
 E read(long timeout, java.util.concurrent.TimeUnit unit)
          等待直到一个新的消息被接收或关联的Channel被关闭.
 ChannelEvent readEvent()
          等待直到一个新的ChannelEvent被接收或关联的Channel被关闭.
 ChannelEvent readEvent(long timeout, java.util.concurrent.TimeUnit unit)
          等待直到一个新的ChannelEvent被接收或关联的Channel被关闭.
 
从类 org.jboss.netty.channel.SimpleChannelUpstreamHandler 继承的方法
channelBound, channelConnected, channelDisconnected, channelInterestChanged, channelOpen, channelUnbound, childChannelClosed, childChannelOpen, handleUpstream, writeComplete
 
从类 java.lang.Object 继承的方法
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

BlockingReadHandler

public BlockingReadHandler()
使用默认非绑定的BlockingQueue实现创建一个新实例.


BlockingReadHandler

public BlockingReadHandler(java.util.concurrent.BlockingQueue<ChannelEvent> queue)
使用指定的BlockingQueue创建一个新实例.

方法详细信息

isClosed

public boolean isClosed()
只有当关联该处理器的Channel已经关闭才返回true.

抛出:
java.lang.IllegalStateException - 如果该处理器还没有被添加到ChannelPipeline,则抛出异常

read

public E read()
       throws java.io.IOException,
              java.lang.InterruptedException
等待直到一个新的消息被接收或关联的Channel被关闭.

返回:
接受到的消息或null(如果关联的Channel被关闭)
抛出:
java.io.IOException - 如果接收一个新消息失败,则抛出异常
java.lang.InterruptedException - 如果操作被打断,则抛出异常

read

public E read(long timeout,
              java.util.concurrent.TimeUnit unit)
       throws java.io.IOException,
              java.lang.InterruptedException
等待直到一个新的消息被接收或关联的Channel被关闭.

参数:
timeout - 等待一个新消息被接收的总时间.如果在超时内没有消息被读取,则抛出 BlockingReadTimeoutException.
unit - 超时的单位
返回:
接受到的消息或null(如果关联的Channel被关闭)
抛出:
BlockingReadTimeoutException - 如果在指定的超时内没有消息被接收,则抛出异常
java.io.IOException - 如果接收一个新消息失败,则抛出异常
java.lang.InterruptedException - 如果操作被打断,则抛出异常

readEvent

public ChannelEvent readEvent()
                       throws java.lang.InterruptedException
等待直到一个新的ChannelEvent被接收或关联的Channel被关闭.

返回:
一个MessageEvent或一个ExceptionEventnull (如果关联的Channel被关闭)
抛出:
java.lang.InterruptedException - 如果操作被打断,则抛出异常

readEvent

public ChannelEvent readEvent(long timeout,
                              java.util.concurrent.TimeUnit unit)
                       throws java.lang.InterruptedException,
                              BlockingReadTimeoutException
等待直到一个新的ChannelEvent被接收或关联的Channel被关闭.

参数:
timeout - 等待一个新ChannelEvent被接收的总时间.如果在超时内没有消息被读取,则抛出 BlockingReadTimeoutException.
unit - 超时的单位
返回:
一个MessageEvent或一个ExceptionEventnull (如果关联的Channel被关闭)
抛出:
BlockingReadTimeoutException - 果在指定的超时内没有消事件被接收,则抛出异常
java.lang.InterruptedException - 如果操作被打断,则抛出异常

messageReceived

public void messageReceived(ChannelHandlerContext ctx,
                            MessageEvent e)
                     throws java.lang.Exception
从类 SimpleChannelUpstreamHandler 复制的描述
当一个从远端发来的消息对象(如: ChannelBuffer)被接收时调用.

覆盖:
SimpleChannelUpstreamHandler 中的 messageReceived
抛出:
java.lang.Exception

exceptionCaught

public void exceptionCaught(ChannelHandlerContext ctx,
                            ExceptionEvent e)
                     throws java.lang.Exception
从类 SimpleChannelUpstreamHandler 复制的描述
当一个I/O线程或ChannelHandler抛出异常时被调用.

覆盖:
SimpleChannelUpstreamHandler 中的 exceptionCaught
抛出:
java.lang.Exception

channelClosed

public void channelClosed(ChannelHandlerContext ctx,
                          ChannelStateEvent e)
                   throws java.lang.Exception
从类 SimpleChannelUpstreamHandler 复制的描述
当一个Channel被关闭且它所有关联的资源被释放时调用.

覆盖:
SimpleChannelUpstreamHandler 中的 channelClosed
抛出:
java.lang.Exception