Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Netty,从非Netty线程写入通道_Java_Multithreading_Events_Netty - Fatal编程技术网

Java Netty,从非Netty线程写入通道

Java Netty,从非Netty线程写入通道,java,multithreading,events,netty,Java,Multithreading,Events,Netty,我正在使用google protobufs设计一个带有Netty的服务器。客户端连接到服务器,发送在非Netty工作线程中处理的请求(此单个工作线程处理来自所有客户端的请求),处理完成后,我希望将响应发送回原始客户端 我想知道发送回复信息的最佳方式 一个选项是让我的Netty通道处理程序实现一个回调接口,工作线程可以在完成请求处理后调用该接口,并在这个回调方法中执行ChannelHandlerContext.write(…) 但这将导致多核CPU的利用率低下,因为请求的处理和对所有客户端响应的p

我正在使用google protobufs设计一个带有Netty的服务器。客户端连接到服务器,发送在非Netty工作线程中处理的请求(此单个工作线程处理来自所有客户端的请求),处理完成后,我希望将响应发送回原始客户端

我想知道发送回复信息的最佳方式

一个选项是让我的Netty通道处理程序实现一个回调接口,工作线程可以在完成请求处理后调用该接口,并在这个回调方法中执行
ChannelHandlerContext.write(…)

但这将导致多核CPU的利用率低下,因为请求的处理和对所有客户端响应的protobufs的编码都将在一个线程中执行

有没有办法在我的Netty通道处理程序回调中将用户定义的事件发布到Netty线程,然后接收此事件并对Netty线程中的传出消息进行protobuf编码


我试图在我的处理程序中使用
ctx.channel().pipeline().fireUserEventTriggered
并实现
userEventTriggered(ChannelHandlerContext ctx,Object evt)
,但无法使其工作。用户事件机制是否用于此目的?如果是,有人有一些示例代码吗?

您可以创建一个MessageDispatcher,在自己的线程中沿着消息队列工作。其他线程只会将必须发送的消息放入队列,不再四处走动。谢谢Derb先生,我可能会这样做,但是有一个小的工作线程池来发送响应可能是有意义的,因为我的响应消息编码要比请求消息解码复杂得多。你不应该担心这一点。Netty是异步工作的(当然,直到您建议它同步工作)。一旦您从调度程序中调用
ctx.write(yourMsg)
,管道处理程序中的所有编码都将在自己的通道线程中进行。@Aardvark如果您有什么工作,您可以发布您自己问题的答案吗?您可以创建一个MessageDispatcher,在自己的线程中处理消息队列。其他线程只会将必须发送的消息放入队列,不再四处走动。谢谢Derb先生,我可能会这样做,但是有一个小的工作线程池来发送响应可能是有意义的,因为我的响应消息编码要比请求消息解码复杂得多。你不应该担心这一点。Netty是异步工作的(当然,直到您建议它同步工作)。一旦您从dispatcher中调用了
ctx.write(yourMsg)
,管道处理程序中的所有编码都将在自己的通道线程中进行。@Aardvark如果您有什么工作,您可以发布自己问题的答案吗?