Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用虚拟目标创建activemq主题订阅服务器的多个实例?_Java_Jms_Messaging_Activemq - Fatal编程技术网

Java 如何使用虚拟目标创建activemq主题订阅服务器的多个实例?

Java 如何使用虚拟目标创建activemq主题订阅服务器的多个实例?,java,jms,messaging,activemq,Java,Jms,Messaging,Activemq,我有一个发布者正在将消息推送到某个主题。我有多个订阅者,每个订阅者在使用该主题的消息后都执行不同的任务。 现在,我希望我的系统能够扩展到运行在不同主机/相同主机上的同一进程的多个实例。e、 g.我希望在不同的主机上运行应用程序A的多个副本,这样,如果A的一个实例运行缓慢,那么其他实例可以拉入后续消息并向前推进。。 我发现使用虚拟目的地是可能的。我按照这里的步骤- 但是,如何使用相同的客户端id设置同一主题的多个订阅者?当我尝试这样做时,我会出错。当我尝试其他方法时,它不起作用。有人能帮忙吗 通

我有一个发布者正在将消息推送到某个主题。我有多个订阅者,每个订阅者在使用该主题的消息后都执行不同的任务。 现在,我希望我的系统能够扩展到运行在不同主机/相同主机上的同一进程的多个实例。e、 g.我希望在不同的主机上运行应用程序A的多个副本,这样,如果A的一个实例运行缓慢,那么其他实例可以拉入后续消息并向前推进。。 我发现使用虚拟目的地是可能的。我按照这里的步骤-

但是,如何使用相同的客户端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分钟,那么您可以创建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);
    
    每当消费者的第一个实例被订阅时,就会自动为其创建队列。从那时起,发送到topic的所有消息都会复制/复制到所有关联的队列中


    希望这有帮助。

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

    虚拟主题有助于实现以下目标: 1.消息的负载平衡 2.订阅服务器的快速故障切换 3.为不同的生产商和消费者重复使用相同的连接工厂。(持久订阅者需要一个唯一的JMS客户机Id,并且该Id不能用于任何其他生产者或消费者)

    下面是一个创建前缀VTCON.*的示例。因此,每个在末尾具有此前缀和主题名称的队列都将使用该消息

    
    


    @vinod您提到了这些[link]()。我在那个链接中看到了xml代码。在哪里可以找到那个xml文件。