如何在webapp中使用netty进行永久TCP远程连接?

如何在webapp中使用netty进行永久TCP远程连接?,netty,ejb-3.1,Netty,Ejb 3.1,由于某些遗留需求,我们需要为遗留系统保留一个开放的TCP套接字,并与之异步交换一些消息。我们有一个从web接收请求的web应用程序,目前还有一个单独的Java应用程序,其中包括Netty,它可以进行遗留通信 我们现在希望以某种方式将Netty直接嵌入到webapp包中,以便在webapp运行时启动套接字,并使webapp(或EJB)与Netty通道进行交互等 你知道怎么做吗 因此,我希望实现的是扔掉JMS队列,我们现在正在使用它来集成netty/legacy部分功能和面向web的功能,换句话说,

由于某些遗留需求,我们需要为遗留系统保留一个开放的TCP套接字,并与之异步交换一些消息。我们有一个从web接收请求的web应用程序,目前还有一个单独的Java应用程序,其中包括Netty,它可以进行遗留通信

我们现在希望以某种方式将Netty直接嵌入到webapp包中,以便在webapp运行时启动套接字,并使webapp(或EJB)与Netty通道进行交互等

你知道怎么做吗


因此,我希望实现的是扔掉JMS队列,我们现在正在使用它来集成netty/legacy部分功能和面向web的功能,换句话说,我希望大大简化体系结构,以便只使用webapp+EJB,但不是JMS。

假设您运行的Servlet容器未配置
SecurityManager
,则可以启动Netty应用程序作为web应用程序的一部分

首先,编写一个
ServletContextListener
实现,当Servlet容器启动或停止web应用程序时,该实现会收到通知。您可以在那里启动和停止您的Netty应用程序。您可能还应该更新
web.xml
,以便Servlet容器获取它

要使Netty应用程序与web应用程序交互(例如,通过Netty应用程序向遗留系统发送消息),您必须向web应用程序公开Netty应用程序。这通常是通过一个单件完成的

因为Netty中的每个操作都是异步的,所以您可能会遇到web应用程序和Netty应用程序之间的“阻抗不匹配”。通常,web应用程序将要求Netty应用程序向遗留系统发送请求,并等待Netty应用程序在从遗留系统收到响应时发出通知

为了处理这种情况,通常可以使用数据结构,例如
BlockingQueue
——在发送请求后,web应用程序将等待队列具有元素,Netty应用程序将向队列添加响应对象以通知web应用程序


如果您使用的是Netty 4,您可能想看看
io.Netty.util.concurrent.Future/Promise
类,这些类对于此类场景来说也是非常有用的构造。

大家好。如何解决与本质上是异步的遗留系统通信的问题?也就是说,接收到Web请求,我需要返回一个同步响应->但与此同时,netty(按照您上面的建议部署)必须联系遗留服务器并接收我可以在servlet中读取的响应。我需要在servlet中轮询结果吗?