2012-01-02 51 views
4

我有一个将消息推送到主题的发布者。我有多个订户,每个订户在消费主题消息后都会执行不同的任务。 现在我希望我的系统能够扩展到在不同主机/同一主机上运行的同一进程的多个实例。例如我想在不同的主机上运行应用程序A的多个副本,以便如果A的一个实例很慢,那么其他实例可以引入后续消息并推进进度。 我发现这可以使用虚拟目标。我遵循这里的步骤 - http://activemq.apache.org/virtual-destinations.html如何使用虚拟目标创建多个activemq主题订户实例?

但是,我如何设置我的多个订户到相同的主题与相同的客户端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”,没有任何反应。一旦你了解它

感谢

+0

@vinod你提到这些[链接](http://activemq.apache.org/virtual-destinations.html)。我看到XML代码在link.Where会发现那个xml文件。 – Hanumath 2013-09-05 06:08:53

回答

5

虚拟主题的功能非常简单,功能相当强大。

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

  2. 实际上,它是耐用消费者的限制 - 每个clientId只允许一个连接。作为一个普通的队列,你可以创建尽可能多的消费者,队列将保证1个消息只能被1个消费者接收。因此,如果您的应用程序A需要1分钟来处理消息,则可以创建5个实例来监听同一队列。当您在1秒内发布5条消息时,您的每个应用程序都将收到自己的消息进行处理。

  3. 有没有很好的文件记录的要求是不直观的。为了使虚拟专题的工作,你需要

    • 使用VirtualTopic.在您的主题名称,例如VirtualTopic.Orders(这个前缀可配置)
    • 使用Consumer.在队列中,你的名字。 Like Consumer.ApplicationA.VirtualTopic.Orders其中应用程序A实际上是您的客户端ID
    • 对上面的队列使用常规订阅者而不是持久订阅者。

示例:每当自动消费者的第一个实例所订阅创建它

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

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

IMessageConsumer consumer = session.CreateConsumer(queue); 

队列。从那一刻起,所有发送到主题的消息都被复制/复制到所有关联的队列中。

希望这会有所帮助。

+0

非常感谢,你的回答非常清楚 – deFreitas 2017-05-12 05:15:18

1

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

虚拟主题使用以下前瞻性帮助:消息 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

相关问题