如何从正常流程之外访问Netty Handler方法

时间:2013-01-16 05:51:14

标签: netty

我正在尝试将Netty(版本3.6.1.final)集成到我们当前的系统中,以便我可以替换当前的NIO代码。

目前我们有一个消息传递总线,其中事件排队等待其他侦听器处理,并将另一个事件放回总线上进行进一步处理。

在我的Netty业务逻辑处理程序的messageReceived()方法中,我将向总线添加一个输入请求。我要传递的一件事是来自Netty事件消息的数据。

我认为我应该在此InputEvent中传递ChannelHandlerContext以及收到的数据/消息。因此,最终在处理OutputEvent时,它可以使用最初传递的ChannelHandlerContext将处理后的数据发送回正确的Netty Channel上的请求客户端。

那么处理OutputEvent的Output任务如何与Netty绑定?

我是否使用ChannelHandlerContext发出了一些调用,我将其用作已处理数据的输入。我不想绑定输出任务。

Netty处理程序的代码片段。

public void messageReceived(
        ChannelHandlerContext ctx, MessageEvent e) {

    byte[] message = (byte[])e.getMessage();

    try {
            data.add(message);
        }
    catch( IOException ioe )
        {
            logger.error(ioe);
        }

    InputEvent ie = new InputEvent( ctx, this, data.getBuffer() );

    try {
              bus.enqueue(ie);
    }
    catch( Exception ex )
   {
      logger.error(ex);
   }

输出处理器的代码段。

public void run() {


    // note that the OutputEvent (event) is available here.  This is not a Netty event.
    ChannelHandlerContext ctx = event.getHandlerContext();
    ClientChannel handler = event.getHandler();

    // I need to send the data in event.getBuffer() back.

// Now what do I do here???


…
…
…

}

谢谢。

2 个答案:

答案 0 :(得分:1)

你只需要打电话:

InputEvent event = ...
ChannelHandlerContext ctx = ....
ctx.write(event.getBuffer());

或者:

InputEvent event = ...
Channel channel = ....
channel.write(event.getBuffer());

答案 1 :(得分:0)

    // Make a new connection.
    ChannelFuture connectFuture =
        bootstrap.connect(new InetSocketAddress(host, port));

    // Wait until the connection is made successfully.
    Channel channel = connectFuture.awaitUninterruptibly().getChannel();

    // Get the handler instance to retrieve the answer.
    FactorialClientHandler handler =
        (FactorialClientHandler) channel.getPipeline().getLast();//get("your handler name")