0

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

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

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

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

我的直接问题是我对 Grizzly 缺乏了解,特别是如何将事件处理与消息传递分离。服务器必须以这样的方式创建待完成的消息,当回复消息从工作人员返回时,服务器知道客户端是谁(在 Grizzly 中找到相关的 FilterChainContext)以便发送 tcp信息。

我也许可以使用 FilterChainContext.getAddress() 并将其放在工作消息上,但我不确定如何编写一个方法,该方法采用对等地址和消息并以某种方式发送 (FilterChainContext.write()) 时它没有 FilterChainContext。

我现在正在考虑保留 Map 的想法,但我对这种方法感到担忧,因为如果在序列化或处理期间消息发生问题,我不希望地图中的内容过时。

欢迎提出想法和建议。

-迈克尔

4

1 回答 1

0

您可以使用 TCP 适配器/网关(可以选择使用 NIO)以及自定义(反)序列化程序。如果你必须使用 Grizzly,你可以编写一个服务器连接工厂实现。在出站适配器(或入站网关)的情况下,端点注册为“TcpListener”(使用 connectionId),并且 SI 消息包含IpHeaders.CONNECTION_ID用于确定哪个连接获得回复的标头。当连接关闭时,它会被取消注册(从地图中删除)。

于 2013-01-28T13:54:11.253 回答