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);
}