activeMq 两种模式的测试

143 阅读3分钟

activeMq有两种模式,说下个人理解

activemq 8186 管理端口 61616 默认服务端口

queue队列模式

topic 主题模式

队列模式: 生产者生成消息存入队列,消费者通过监听队列的queue消费者负责消费,且每个消息只能消费一次.

应用场景: 登陆成功,记录日志/记录状态/记录ip 等的一些列操作,可以异步执行,相对于来说不须要同步的操作,可以保证操作要求的请求不丢失

主题模式: 生产者生成消息,发布消息,订阅之后的消费者都可以读取到发布的消息,并且所有消息均可被多个消费者都消费一次

应用场景: 商城下单成功后,发送一条成功的消息,被日志系统/库存系统/物流系统 分别读取到,并做相应操作

springboot+activemq整合

1 引入pom依赖

org.springframework.boot

<artifactId>spring-boot-starter-activemq

<version>1.5.20.RELEASE

<groupId>org.messaginghub

<artifactId>pooled-jms

<version>1.0.4

2 分别编写 生产者 消费者 配置类

@Component

public class ActiveSend {

@Autowired

private Queuequeue;

@Autowired

private Topictopic;

@Autowired

private JmsMessagingTemplatejmsMessagingTemplate;

public void sendQueue()throws JMSException {

ObjectMessage objectMessage =new ActiveMQObjectMessage();

    objectMessage.setObject("nihao");

    jmsMessagingTemplate.convertAndSend(queue,objectMessage);

}

public void sendTopic()throws JMSException {

ObjectMessage objectMessage =new ActiveMQObjectMessage();

    objectMessage.setObject("nihao");

    jmsMessagingTemplate.convertAndSend(topic,objectMessage);

}

}

@Component

public class ActiveListenner {

@JmsListener(destination ="active-queue")

public void reciveQueueMsg(ObjectMessage message)throws JMSException {

System.out.println("收到的消息"+message.getObject().toString());

}

@JmsListener(destination ="active-topic")

public void reciveTopicMsg(ObjectMessage message)throws JMSException {

System.out.println("主题收到的消息"+message.getObject().toString());

}

}

@Configuration

public class ActiveMqConfig {

@Bean

public Queuequeue (){

return new ActiveMQQueue("active-queue");

}

@Bean

public Topictopic (){

return new ActiveMQTopic("active-topic");

}

}

做一下说明,队列模式/主题模式,都是以配置类中的 关键字为判断对象,且两种模式不能共存

目录结构 监听1是监听复制过去的,为了测试

为了测试什么呢?

测试队列模式,是否两个消费者都消费,且均分

测试主题模式,是否消息产生后,两个消费者都消费一次

yml 配置:

spring:

jms:

默认情况下activemq提供的是queue模式,若要使用topic模式需要配置下面配置

pub-sub-domain:false

activemq消息队列

activemq:

broker-url: tcp://172.18.3.180:61616

#是否是内存模式(内置MQ,true是 false否)

in-memory:false

# 等待消息发送响应的时间。设置为0等待永远

send-timeout: 0

user:'admin'

password:'admin'

packages:

#信任所有的包

  trust-all:true

pool:

#是否替换默认的连接池,使用ActiveMQ的连接池需引入的依赖

  enabled:false

pub-sub-domain:false 不启用主题模式,即队列模式,当为true时,为主题模式

现在是队列模式,编写测试类测试

运行queueTest,产生10次消息

一个监听/一个监听1 分别打印五次,共十次

改变配置 将yml中的配置 pub-sub-domain:false 变为pub-sub-domain:true,开启主题模式

执行topicTest方法,只产生一条消息

监听/监听1 分别消费一次,共消费两次

假如有10个监听者,那么主题模式下(topic),一个消息将被消费十次

本文转自 jimolvxing.blog.csdn.net/article/det…,如有侵权,请联系删除。