【问题标题】:Using Grizzly with JMS/ActiveMQ将 Grizzly 与 JMS/ActiveMQ 一起使用
【发布时间】:2013-01-11 15:28:02
【问题描述】:

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

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

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

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

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

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

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

欢迎提出想法和建议。

-迈克尔

【问题讨论】:

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

标签: activemq spring-integration grizzly


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-03-10
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    相关资源
    最近更新 更多