ActiveMQ同时向topic和queue发送消息

       ActiveMQ消息中间件可以支持同时向topic和queue发送消息,它有3种实现方式:

       1.直接在消息生产端使用jms的类来实现,官方文档地址为https://activemq.apache.org/composite-destinations

        1).默认queue实现

Queue queue = new ActiveMQQueue("FOO.A,FOO.B,FOO.C");
producer.send(queue, someMessage);

       2).可以使用queue://和topic://的方式实现

Queue queue = new ActiveMQQueue("queue://FOO.A,topic://NOTIFY.FOO.A");
producer.send(queue, someMessage);

       ActiveMQQueue默认情况下是queue://,因此也可以省略掉queue://。

       2.直接配置ActiveMQ服务器,在confi目录下找到activemq.xml,官方文档地址为https://activemq.apache.org/virtual-destinations

<!-- 在 activemq.xml 的broker节点下添加 -->
<destinationInterceptors>
 <virtualDestinationInterceptor> 
   <virtualDestinations> 
     <compositeQueue name="MY.QUEUE">
       <forwardTo>
         <queue physicalName="FOO" /> 
         <topic physicalName="BAR" />
       </forwardTo>
     </compositeQueue>
   </virtualDestinations>
 </virtualDestinationInterceptor>
</destinationInterceptors>

满足selector的跳转

<!-- 在 activemq.xml 的broker节点下添加 -->
<destinationInterceptors>
 <virtualDestinationInterceptor> 
   <virtualDestinations> 
     <compositeQueue name="MY.QUEUE">
       <forwardTo>
         <queue selector="odd = 'yes'" physicalName="FOO" /> 
         <topic selector="i = 5" physicalName="BAR" />
       </forwardTo>
     </compositeQueue>
   </virtualDestinations>
 </virtualDestinationInterceptor>
</destinationInterceptors>

3.使用spring的方式

jmsTemplate.execute((session, messageProducer) -> {
                Message message = jmsTemplate.getMessageConverter().toMessage(orderDeleteDTO, session);
                // 添加property属性,因为header为固定的
                message.setStringProperty("delOrder","updateStatus");
                if (UserTypeConstant.MERCHANT.equals(userType)){
                    message.setStringProperty("delUserType","merchant");
                }else {
                    message.setStringProperty("delUserType","other");
                }
                // 同时定义给queue和topic发送
                Queue queue = session.createQueue("queue://helloQueue,topic://helloTopic");
                messageProducer.send(queue,message);

消费者的接收,使用spring的方式

@JmsListener(destination = "helloQueue", selector = "delOrder='updateStatus'")
    public void jmsQueueTest(OrderDeleteDTO orderDeleteDTO,
                             @Header("delUserType") String delUserType,
                             @Header("delOrder") String delOrder) {
        String userType = orderDeleteDTO.getUserType();
        System.out.println("queue:" + userType + ",delUserType:" + delUserType + ",delOrder:" + delOrder);
    }

    @JmsListener(destination = "helloTopic",
            containerFactory = "topicFactory",
            selector = "delUserType='merchant'")
    public void jmsTopicTest(OrderDeleteDTO orderDeleteDTO,
                             @Header("delUserType") String delUserType,
                             @Header("delOrder") String delOrder) {
        String userType = orderDeleteDTO.getUserType();
        System.out.println("topic:" + userType + ",delUserType:" + delUserType + ",delOrder:" + delOrder);
    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 JMX API 获取 ActiveMQ 中所有的 TopicQueue,具体的 Java 代码如下: ```java import java.util.Set; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import org.apache.activemq.ActiveMQConnectionFactory; public class ArtemisTopicQueueInfo { public static void main(String[] args) throws Exception { ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); connectionFactory.setBrokerURL("tcp://localhost:61616"); connectionFactory.setUserName("admin"); connectionFactory.setPassword("admin"); JMXServiceURL jmxServiceUrl = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"); JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxServiceUrl, null); MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection(); ObjectName brokerName = new ObjectName("org.apache.activemq.artemis:brokerName=\"localhost\",module=JMS,type=Broker"); Set<ObjectName> queueNames = mBeanServerConnection.queryNames(new ObjectName(brokerName + ",component=addresses,address=*"), null); System.out.println("Queues:"); for (ObjectName queueName : queueNames) { String queue = queueName.getKeyProperty("address").replace("_", "/"); System.out.println(queue); } Set<ObjectName> topicNames = mBeanServerConnection.queryNames(new ObjectName(brokerName + ",component=addresses,address/#"), null); System.out.println("Topics:"); for (ObjectName topicName : topicNames) { String topic = topicName.getKeyProperty("name").replace("_", "/"); System.out.println(topic); } jmxConnector.close(); } } ``` 请注意,该代码中的 ActiveMQConnectionFactory、brokerUrl 以及用户名和密码应该替换为你自己的配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值