T V*_*pta 5 java messaging activemq-classic jms
我有一个将消息推送到主题的发布者.我有多个订阅者,一旦他们使用来自主题的消息,就会执行不同的任务.现在,我希望我的系统可以扩展到在不同主机/同一主机上运行的同一进程的多个实例.例如,我想在不同的主机上运行我的应用程序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();
Run Code Online (Sandbox Code Playgroud)
当我尝试创建第二个订阅者并将主题名称传递为"VirtualTopic.myTopic"时,没有任何反应.
谢谢
虚拟主题功能非常简单,一旦您理解它就非常强大.
使用虚拟主题时 - 不需要耐用的消费者.这是因为对于每个客户端,您将获得一个创建常规队列的实例.如果您有5个客户端(应用程序A,B,C,D,E),则每次将消息发送到虚拟主题时,将创建5个队列并填充消息副本.
实际上它是持久消费者的限制 - 每个clientId只允许一个连接.作为常规队列,您可以根据需要创建任意数量的消费者,队列将保证仅1个消费者将接收1条消息.因此,如果您有需要1分钟处理消息的应用程序A,您可以创建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);
Run Code Online (Sandbox Code Playgroud)
每当第一个消费者实例订阅它时,就会自动创建队列.从那时起,发送到主题的所有消息都被复制/复制到所有关联的队列中.
希望这可以帮助.
虚拟主题就是您的答案。但是,您必须为所有虚拟主题队列定义命名标准。这是这个问题的答案:
虚拟主题有助于实现以下前景: 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
| 归档时间: |
|
| 查看次数: |
8850 次 |
| 最近记录: |