我需要开发一个基于netty的客户端,它接受来自Notification Server的消息,并将这些消息作为Http请求实时发送到另一个服务器。 我已经编写了一个可以执行此操作的工作应用程序,但我需要为此添加多线程。 在这一点上,我对如何处理多线程程序中的Netty Channels感到困惑,因为我已经加载了传统的套接字和线程方法。
当我尝试将Netty请求部分分离为方法时,它抱怨频道未被关闭。 任何人都可以指导我如何处理这个? 我想使用ExecutionHandler和OrderedMemoryAwareThreadPoolExecutor,但我真的很喜欢这个。
此时帮助一些例子将是一个真正的好处。
提前致谢。
答案 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都将在一个额外的线程中执行,因此不会阻止工作线程。