[英]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”时,没有任何反应。
谢谢
一旦了解了虚拟主题功能,该功能将非常简单且功能强大。
使用虚拟主题时-不需要持久的使用者。 这是因为对于每个客户端,您将获得一个创建的常规队列实例。 如果您有5个客户端(应用程序A,B,C,D,E),则每次将消息发送到虚拟主题时,将创建5个队列,并使用消息的副本填充这些队列。
实际上,这是持久使用者的限制-每个clientId仅允许一个连接。 作为常规队列,您可以创建任意数量的使用者,并且队列将保证只有1个使用者将收到1条消息。 因此,如果您的应用程序A需要1分钟来处理一条消息,则可以创建5个实例来侦听同一队列。 当您在1秒内发布5条消息时,每个应用程序都会收到自己的消息进行处理。
没有充分记录的要求,这些要求不直观。 要使虚拟主题正常工作,您需要
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.