我们可以为Netty客户端应用程序使用的最佳架构是什么?

时间:2012-03-21 12:41:04

标签: multithreading netty

我需要开发一个基于netty的客户端,它接受来自Notification Server的消息,并将这些消息作为Http请求实时发送到另一个服务器。 我已经编写了一个可以执行此操作的工作应用程序,但我需要为此添加多线程。 在这一点上,我对如何处理多线程程序中的Netty Channels感到困惑,因为我已经加载了传统的套接字和线程方法。

当我尝试将Netty请求部分分离为方法时,它抱怨频道未被关闭。 任何人都可以指导我如何处理这个? 我想使用ExecutionHandler和OrderedMemoryAwareThreadPoolExecutor,但我真的很喜欢这个。

此时帮助一些例子将是一个真正的好处。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您是否查看了Netty site上的示例代码? TelnetServer看起来像你在说什么。工厂在获得连接时会创建新的处理程序。只要有新连接,就会使用来自Executors的线程。你可以在那里使用任何线程池和执行器:

// Configure the server.
ServerBootstrap bootstrap = new ServerBootstrap(
        new NioServerSocketChannelFactory(
                Executors.newCachedThreadPool(),       << change
                Executors.newCachedThreadPool()));     << change

// Configure the pipeline factory.
bootstrap.setPipelineFactory(new TelnetServerPipelineFactory());

// Bind and start to accept incoming connections.
bootstrap.bind(new InetSocketAddress(8080));

TelnetServerHandler然后处理个别结果。

@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {

    // Cast to a String first.
    // We know it is a String because we put some codec in TelnetPipelineFactory.
    String request = (String) e.getMessage();

    // Generate and write a response.
    String response;
    boolean close = false;
    if (request.length() == 0) {
        response = "Please type something.\r\n";

当telnet准备好关闭连接时,它会这样做:

ChannelFuture future = e.getChannel().write(response);
if (close) {
    future.addListener(ChannelFutureListener.CLOSE);
}

答案 1 :(得分:0)

只需将ExecutionHandler添加到ChannelPipeline即可。这将确保在ExecutionHandler后面添加的每个ChannelUpstreamHandler都将在一个额外的线程中执行,因此不会阻止工作线程。