当前位置: 首页 > 知识库问答 >
问题:

在ActiveMQ中,是否有一种方法可以将消息副本从远程代理中的一个队列发送到另一个队列?

邓深
2023-03-14

问题声明:两个不同的代理中有两个队列。每个队列都有一个消费者。生产者正在第一个队列上丢弃消息。我们希望将消息副本发送到第二个队列。为了可视化

经纪人1--

问题是

    < li >每个代理中只创建一个队列。我已经实现了上述4个队列,但寻找更优化的解决方案。 < li >不希望使用任何主题。 < li >只能通过activemq提供的配置来完成。

到目前为止我做了什么:我设法用4个队列完成了上述操作。在Broker1中,Queue1将副本转发到虚拟目标队列。此外,通过网络连接器将虚拟目的地中的消息发送到代理2。

    <destinationInterceptors>
        <virtualDestinationInterceptor>
            <virtualDestinations>
                <compositeQueue name="Queue1" forwardOnly="false">
                    <forwardTo>
                        <queue physicalName="IntermediateQueue"/>
                    </forwardTo>
                </compositeQueue>
            </virtualDestinations>
        </virtualDestinationInterceptor>
    </destinationInterceptors>

    
    <networkConnectors>
     <networkConnector 
        name="Q:broker1->broker2" 
        uri="static:(tcp://localhost:31616)" 
        duplex="false" 
        staticBridge="true">
        <staticallyIncludedDestinations>
            <queue physicalName="IntermediateQueue"/>
        </staticallyIncludedDestinations>
     </networkConnector>
 </networkConnectors>
 

在Broker2中,将在中间队列中接收的所有消息转发到实际目的队列。

    <destinationInterceptors>
      <virtualDestinationInterceptor>
        <virtualDestinations>
          <compositeQueue name="IntermediateQueue">
            <forwardTo>
              <queue physicalName="FinalDestinationQueue" />
            </forwardTo>
          </compositeQueue>
        </virtualDestinations>
      </virtualDestinationInterceptor>
    </destinationInterceptors> 

感谢任何帮助,因为通过ActiveQ留档和论坛并没有得到这个问题的优化答案。

共有1个答案

祁博雅
2023-03-14

您实际上是在重新创建pub-sub,然后为多代理集成添加传输队列模式。有有效的用例可以做到这一点,您的方法是有效的,并且在复合目的地和网络连接器的预期设计范围内。这种方法的权衡是需要大量的管理和配置管理。

我知道您不喜欢使用主题。但是,您可以考虑查看Virtual Topics1,它以一种优雅的方式解决了这个问题,并允许您动态添加新的消费者,而无需修改代理配置。

制片人发送到主题:

topic://VT.ORDER.EVENT

消费者从特殊命名队列中读取

客户端 A: queue://VQ.CLIENTA.VT.ORDER.EVENT

clientB:queue://VQ.CLIENTB.VT.ORDER.EVENT

参考:虚拟主题

 类似资料:
  • 我主要在RPC模式下使用rabbitMq,但我还想将请求和响应消息复制到另一个队列。 最后,我想实现的是,外部消费者可以通过听一个队列来查看所有流量,我们称之为“日志队列”。 复制传入消息是可以的,我只需要使用扇出交换,或者使用与RPC调用使用的路由密钥相同的路由密钥将日志队列绑定到使用过的交换。 但我无法找到通过直接回复功能“扇出”发送的消息的方法。 到目前为止,我了解到响应消息以amqp的形式

  • 我有两个具有双工网桥配置的代理。有时会出现以下情况:代理之间存在连接,从代理B到代理a的消息正常转发。但不从代理A转发到代理B。重新启动代理B时,将发送所有消息。日志中没有错误。ActiveMQ版本5.10。 代理 A 的配置: 经纪商B配置: 如何制作可靠的双工桥?

  • 如果在发送接收到的消息时发生异常,则会丢失已接收到的消息。

  • 要求:我们需要从JMS队列(由另一个应用程序发布)中检索一条消息,并将该消息持久保存在我们的JMS队列中。需要整个流是事务性的,所以如果消息不能持久化到下游JMS队列中,则不应该确认从上游JMS队列接收到的消息。我的配置如下 在这种情况下,我需要使用JmsTransactionManager,还是应该高于配置就足够了。我们可以处理重复的消息,所以我相信我们不需要XA事务。

  • 我有两个独立实例(p1、p2)的生产者应用程序和两个独立实例(c1、c2)的消费者应用程序。 生产者p1连接到exchange,主题为t1,队列名称为name1。 使用者c1连接到exchange,主题为t1,队列名称为name1。 生产者p2连接到exchange,主题为t2,队列名称为name1。 使用者c2连接到exchange,主题为t2,队列名称为name1。 我在RabbitMQ GU

  • 在我对Artemis LastValueQueue代码的测试和回顾中,消息的调度延迟似乎优先于对“last value key”的评估。换言之,如果您安排了一条消息,那么它只会在准备传递时替换队列中的最后一个值。 我的问题是我是否正确理解了代码,如果是,是否有一个解决方案或ActiveMQ/Artemis的功能可以帮助满足我们的要求。 我们的要求如下: 生成一条消息,并将该消息的处理延迟到将来的某