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

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

queue队列模式

topic 主题模式

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

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

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

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

springboot+activemq整合

1 引入pom依赖

<groupId>org.springframework.boot
    <artifactId>spring-boot-starter-activemq
    <version>1.5.20.RELEASE
    <groupId>org.messaginghub
    <artifactId>pooled-jms
    <version>1.0.4
</dependency>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.

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

activeMq 两种模式的测试_队列

目录结构 监听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

activeMq 两种模式的测试_kafka_02

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

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

activeMq 两种模式的测试_java_03

运行queueTest,产生10次消息

activeMq 两种模式的测试_java_04

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

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

activeMq 两种模式的测试_kafka_05

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

activeMq 两种模式的测试_java_06

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

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