【问题标题】:Is it possible to send messages to multiple queues using STOMP?是否可以使用 STOMP 将消息发送到多个队列?
【发布时间】:2012-04-18 01:41:11
【问题描述】:

我正在 PHP 项目中寻找 RabbitMQ 替代品。到目前为止,我正在考虑的两个选项是 Kestrel 和 Qpid(如果我们决定坚持使用 AMQP(我想避免))。在 RabbitMQ 中,您可以将消息发送到交换(目标),该交换决定应将消息传递到哪些队列或主题(在 JMS 术语中)。阻止我选择 STOMP 服务器(ActiveMQ/Apollo 或 HornetQ)的原因是我无法确定是否可以在 STOMP 中将消息发送到目的地,以便将消息传递到多个队列(在 JMS条款)?发件人不应该知道应该将消息传递到哪个队列。

谢谢。

【问题讨论】:

    标签: message-queue activemq hornetq stomp


    【解决方案1】:

    您可以在 ActiveMQ 中使用名为 Composite Destinations 的东西来通过 Stomp 或标准 JMS 客户端执行此操作。 Stomp 目的地以 /queue/ 字符串为前缀,然后是目的地的名称。你也可以在 ActiveMQ 中使用Virtual Destinations。当然,ActiveMQ 中的 Destination 字符串可以支持wildcards

    【讨论】:

    • 如果我理解正确的话,通配符可以用来订阅一组队列,但不能用来发送消息?而且复合目的地要求在发送消息时枚举所有目的地,这似乎违背了将生产者与消费者解耦的想法。
    • 如果您阅读了有关复合目标的完整页面,您会发现一个指向代理端配置的链接,可以满足您的需求:activemq.apache.org/…。 “阅读,它的根本。”
    • [惭愧,但坚持不懈] 我说得对吗,这只能在服务器配置文件中启用(希望无需重新启动)? STOMP 选择器是否足够(且更灵活)的替代品?谢谢!
    • 是的,这些是服务器端配置选项。 ActiveMQ 需要重启,Apollo 的许多配置选项不需要重启。
    【解决方案2】:

    在 HornetQ 中,您可以使用Diverts(专有和非专有)。 STOMP 消息将到达原始队列,但随后将透明地转移到 hornetq-configuration.xml 中配置的适当队列。

    您还可以应用带有转移的过滤器,以便将消息隔离到适当的队列中。

    【讨论】:

    • 听起来不错,但我很想问同样的问题:只能在服务器端启用转移? STOMP 选择器会直接转化为过滤器吗?
    【解决方案3】:

    我自己也面临同样的问题,并通过 ActiveMQ XML 中的以下配置解决了。

    <destinationInterceptors>
     <virtualDestinationInterceptor> 
      <virtualDestinations> 
       <compositeQueue name="MY.QUEUE">
        <forwardTo>
         <queue physicalName="FOO" /> 
         <queue physicalName="BAR" />
        </forwardTo>
       </compositeQueue>
      </virtualDestinations>
     </virtualDestinationInterceptor>
    </destinationInterceptors> 
    

    参考http://activemq.apache.org/virtual-destinations.html

    【讨论】:

      猜你喜欢
      • 2017-12-10
      • 2014-08-28
      • 2011-03-15
      • 2014-03-05
      • 2010-11-05
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      相关资源
      最近更新 更多