ActiveMQ中虚拟目的地


虚拟目的地允许我们创建映射到一个或多个物理目的地的逻辑目的地。 虚拟目的地是逻辑目的地,是映射到一个或多个物理目的地的队列或主题的组合。它提供松散耦合的消息传递配置,当应用程序在多个实例上运行时尤其有用。 在本文中,我们将借助一个简单的 Spring Boot 应用程序了解虚拟目的地如何在 ActiveMQ 中工作。
先决条件 通过从官方网站下载安装程序来安装 Apache ActiveMQ 。此处介绍了在各种操作系统上安装 ActiveMQ 的指南。 创建一个简单的 Spring Boot 应用程序并在 pom.xml 中添加以下依赖项。此依赖项适用于使用 ActiveMQ 的 JMS 消息传递。

<dependency> 
  <groupId>org.springframework.boot</groupId> 
  <artifactId>spring-boot-starter-activemq</artifactId> 
</dependency>

虚拟主题 虚拟主题的概念是生产者以通常的 JMS 方式发送到一个主题,但该主题是虚拟的。侦听器可以从他们自己的队列或通过逻辑主题订阅进行消费。 ActiveMQ 会将主题中的每条消息复制并复制到消费者队列。

JMS生产者
我们将编写一个简单的生产者,它将创建一个虚拟主题并发布关于该主题的消息。

@Component 
public class JMSProducer {     private final JmsTemplate jmsTemplate;     public JMSProducer(final JmsTemplate jmsTemplate) { 
        this.jmsTemplate = jmsTemplate; 
    }     public void createVirtualTopicAndPublishMessage() { 
        jmsTemplate.convertAndSend(new ActiveMQTopic("VirtualTopic.medium"), "测试虚拟主题"); 
    } }

请注意,主题名称是“VirtualTopic.medium”,ActiveMQ 中虚拟主题的默认命名约定以前缀“VirtualTopic.>”开头。但是,我们可以通过在 ActiveMQ 代理配置中配置来自定义这些名称。

JMS消费者
我们现在要编写一个消费者来监听队列以接收将在虚拟主题上发布的消息。

@Component 
public class JMSConsumer { 
    private static final Logger LOGGER = LoggerFactory. getLogger (JMSConsumer.class);     @JmsListener(destination = "Consumer.app.VirtualTopic.medium") 
    public void readMessage(final TextMessage message) { 
 LOGGER .info("Received message {}", message); 
    } }

队列名称以约定“Consumer.[clientName].VirtualTopic.>”命名,这是与虚拟主题关联的队列的默认约定。
在虚拟主题“VirtualTopic.medium”上发布的任何消息都将被复制到队列“Consumer.app.VirtualTopic.medium”。

测试示例应用程序
让我们编写一个简单的命令行运行器类,用于在应用程序启动时发布消息。

@Component 
public class AppCommandLineRunner implements CommandLineRunner {     private final JMSProducer jmsProducer;     public AppCommandLineRunner(final JMSProducer jmsProducer) { 
        this.jmsProducer = jmsProducer; 
    }     @Override 
    public void run(String... args) { 
        jmsProducer.createVirtualTopicAndPublishMessage(); 
    } 
}

运行应用程序,我们将在 ActiveMQ 控制台中看到正在创建的主题和队列。我们可以在http://localhost:8161/admin/index.jsp导航到 ActiveMQ 控制台。
我们应该能够在主题视图中看到虚拟主题。


我们还将在队列视图中看到队列。如果应用程序已成功运行,那么我们将看到一条消息正在入队和出队。

自定义配置 正如我之前提到的,可以通过代理配置自定义命名约定。这可以通过修改 activemq.xml 文件来完成。 它不仅允许您自定义名称,还允许您打开默认情况下停用的选择器感知。选择器感知可用于选择性地将消息转发到不同的目的地。

<destinationInterceptors> 
  <virtualDestinationInterceptor> 
    <virtualDestinations> 
      <virtualTopic name=">" prefix="VirtualTopicConsumers.*" selectorAware="false"/>    
    </virtualDestinations> 
  </virtualDestinationInterceptor> 
</destinationInterceptors>

结论
我们可以使用虚拟主题根据需要添加任意数量的消费者,而无需修改 ActiveMQ 代理配置。 我希望本文能帮助您了解虚拟目的地。在https://activemq.apache.org/virtual-destinations阅读更多内容。