将Grizzly与JMS/ActiveMQ一起使用

将Grizzly与JMS/ActiveMQ一起使用,activemq,spring-integration,grizzly,Activemq,Spring Integration,Grizzly,我正在进行一个概念验证项目,旨在探索将工作从NIO服务器转移到后端处理的消息队列的好处。我将Grizzly用于NIO样板文件,将Spring集成用于消息传递(使用JMS/ActiveMQ作为消息传递实现)。基本上,我想做的是: 客户端连接->服务器->服务器创建“要完成的工作”消息->JMS/ActiveMQ 在ActiveMQ消息队列上,许多“工作者”将积极地使用这些消息,处理它们,并将结果放在另一个队列上。服务器正在侦听该队列上的“响应消息”,一旦收到消息,它将执行以下操作: 响应队列->服

我正在进行一个概念验证项目,旨在探索将工作从NIO服务器转移到后端处理的消息队列的好处。我将Grizzly用于NIO样板文件,将Spring集成用于消息传递(使用JMS/ActiveMQ作为消息传递实现)。基本上,我想做的是:

客户端连接->服务器->服务器创建“要完成的工作”消息->JMS/ActiveMQ

在ActiveMQ消息队列上,许多“工作者”将积极地使用这些消息,处理它们,并将结果放在另一个队列上。服务器正在侦听该队列上的“响应消息”,一旦收到消息,它将执行以下操作:

响应队列->服务器将消息序列化为客户端可以理解的内容->返回给客户端

我眼前的问题是我对Grizzly缺乏了解,特别是如何将事件处理与消息传递解耦。服务器必须以这样的方式创建待完成工作消息:当应答消息从工作者返回时,服务器知道客户端是谁(在Grizzly中查找相关的FilterChainContext),以便发送tcp消息

我可能能够使用FilterChainContext.getAddress()并将其放在工作消息上,但我不确定如何编写一个方法,该方法在没有FilterChainContext的情况下,获取对等地址和消息并以某种方式发送(FilterChainContext.write())

我现在正在考虑保留一个映射的想法,但我担心这种方法,因为我不希望在序列化或处理过程中消息出现问题时映射中的内容过时

欢迎提出意见和建议


-Michael

您可以使用TCP适配器/网关(可以选择使用NIO)以及自定义(反)序列化程序。如果必须使用Grizzly,可以编写服务器连接工厂实现。对于出站适配器(或入站网关),端点注册为“TcpListener”(使用connectionId),SI消息包含
IpHeaders.CONNECTION\u ID
头,用于确定哪个连接获得应答。当连接关闭时,它将被取消注册(从映射中删除)。

您是否尝试过在“待完成工作”消息中保留对FilterChainContext的引用,并将所述引用传递给您的回复,以便您的筛选器可以获取并写入?