繁体   English   中英

如何使用虚拟目标创建activemq主题订户的多个实例?

[英]how to create multiple instances of activemq topic subscribers using virtual destinations?

我有一个将消息推送到某个主题的发布者。 我有多个订阅者,一旦他们使用了该主题的消息,每个订阅者便会执行不同的任务。 现在,我希望系统可以扩展到在不同主机/同一主机上运行的同一进程的多个实例。 例如,我想在不同的主机上运行我的应用程序A的多个副本,这样,如果A的一个实例运行缓慢,则其他实例可以拉入后续消息并取得前进。。我发现使用虚拟目标是可能的。 我按照这里的步骤操作-http: //activemq.apache.org/virtual-destinations.html

但是,如何设置具有相同客户端ID的同一主题的多个订户? 当我尝试这样做时,我会出错。 当我尝试其他方法时,它不起作用。 有人可以帮忙吗?

通常,我通过执行以下步骤来启动订户-

        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, ActiveMQConnection.DEFAULT_BROKER_URL;);
        activeMQConnection = connectionFactory.createConnection();

        activeMQConnection.setClientID("subscriber1");
        activeMQConnection.setExceptionListener(exceptionListener);
        activeMQSession = activeMQConnection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
        activeMQTopic = activeMQSession.createTopic("myTopic");            
        activeConsumer = activeMQSession.createDurableSubscriber(activeMQTopic, "myTopic");            
        activeConsumer.setMessageListener(messageListener);
        activeMQConnection.start();

当我尝试创建第二个订阅服务器并将主题名称传递为“ VirtualTopic.myTopic”时,没有任何反应。

谢谢

一旦了解了虚拟主题功能,该功能将非常简单且功能强大。

  1. 使用虚拟主题时-不需要持久的使用者。 这是因为对于每个客户端,您将获得一个创建的常规队列实例。 如果您有5个客户端(应用程序A,B,C,D,E),则每次将消息发送到虚拟主题时,将创建5个队列,并使用消息的副本填充这些队列。

  2. 实际上,这是持久使用者的限制-每个clientId仅允许一个连接。 作为常规队列,您可以创建任意数量的使用者,并且队列将保证只有1个使用者将收到1条消息。 因此,如果您的应用程序A需要1分钟来处理一条消息,则可以创建5个实例来侦听同一队列。 当您在1秒内发布5条消息时,每个应用程序都会收到自己的消息进行处理。

  3. 没有充分记录的要求,这些要求不直观。 要使虚拟主题正常工作,您需要

    • 使用VirtualTopic. 在您的主题名称中,例如VirtualTopic.Orders (可以配置此前缀)
    • 使用Consumer. 以您的队列名称。 类似于Consumer.ApplicationA.VirtualTopic.Orders ,其中ApplicationA实际上是您的客户端ID
    • 对上面的队列使用常规订户而不是持久订户。

例:

string activeMqConsumerTopic = "Consumer.AmqTestConsumer.VirtualTopic.Orders";

IQueue queue = SessionUtil.GetQueue(session, activeMqConsumerTopic);

IMessageConsumer consumer = session.CreateConsumer(queue);

只要订阅了使用者的第一个实例,便会自动创建队列。 从那时起,所有发送到主题的消息都被复制/复制到所有关联的队列中。

希望这可以帮助。

虚拟主题是您的答案。 但是,您必须为所有虚拟主题队列定义一个命名标准。 这是答案:

虚拟主题有助于满足以下预期需求:1.消息的负载平衡2.用户的快速故障转移3.为不同的生产者和消费者重复使用相同的连接工厂。 (持久订户需要一个唯一的JMS客户端ID,并且不能将其重复用于任何其他生产者或使用者)

这是执行此操作的方法,下面的示例创建前缀VTCON。*。 因此,每个带有此前缀和主题名称的队列都将使用该消息。

<virtualDestinations> <virtualTopic name="TEST.TP01" prefix="VTCON.*." selectorAware="false"/> </virtualDestinations>

http://workingwithqueues.blogspot.com/2012/05/activemq-virtual-topics-or-virtual.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM