SpringBoot整合activeMQ的简单案例

ActiveMQ是什么

ActiveMQ是消息队列技术,为解决高并发问题而生
ActiveMQ生产者消费者模型(生产者和消费者可以跨平台、跨系统)
ActiveMQ支持如下两种消息传输方式
点对点模式,生产者生产了一个消息,只能由一个消费者进行消费
发布/订阅模式,生产者生产了一个消息,可以由多个消费者进行消费

SpringBoot的简单整合

1. ActiveMQ下载启动

http://activemq.apache.org/download-archives.html ,本文用的是windows版的5.15.3版本,下载下来是压缩包,自行解压一个到目录下,CMD进入到解压目录下的bin目录下,执行 activemq.bat start 启动。如果能成功访问http://localhost:8161/admin(用户名和密码默认为admin),则启动成功。

2.添加依赖

创建两个springboot项目,分别作为消息提供者(provider)和消费者(consumer),添加依赖

<dependency>
 	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<!--消息队列连接池-->
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-pool</artifactId>
    <version>5.15.0</version>
</dependency>

3. boot_mq_product

启动类加入 @EnableJms

application.yml
server:
  port: 7777
spring:
  application:
    name: boot_mq_product
  activemq:
    broker-url: tcp://127.0.0.1:61616 #MQ服务器地址
    user: admin
    password: admin
  jms:
    pub-sub-domain: true #false = queue   true = topic

# 自己定义队列名称(P2P)
myqueue: boot-activemq-queue
# 发布/订阅模式的名称
mytopic: boot-activemq-topic
Queue_Produce
@RestController
public class Queue_Produce {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    @Value("${myqueue}")
    private String myQueue;

    @PostMapping("send")
    public void produceMsg(){
        jmsMessagingTemplate.convertAndSend(myQueue,"我是一条消息");
        System.out.println("消息推送到MQ成功");
    }

    @PostMapping("send1")
    public void produceMsg1(){
        User user = new User(1,"张三","123456");
        String s = JSON.toJSONString(user);
        jmsMessagingTemplate.convertAndSend(myQueue,s);
        System.out.println("User推送到MQ成功");
    }
}
Topic_Produce
@RestController
public class Topic_Produce {
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    @Value("${mytopic}")
    private String mytopic;

    @PostMapping("sendTopic")
    public void sendTopic() {
        String msg="发送Topic消息内容 :"+"我是一条订阅消息";
        jmsMessagingTemplate.convertAndSend(mytopic, msg);
        System.out.println("订阅消息发送成功");
    }
}

boot_mq_consumer

application.yml
server:
  port: 7778 # 端口号
spring:
  application:
    name: boot_mq_consumer
  activemq:
    broker-url: tcp://127.0.0.1:61616 # 自己的MQ服务器地址,用自己的
  jms:
    pub-sub-domain: true  # false = Queue true = Topic

# 自己定义的队列名称(P2P)
myqueue: boot-activemq-queue
# 发布/订阅模式的名称
mytopic: boot-activemq-topic

Queue_Consumer

@Component
public class Queue_Consumer {
    /**
     * 使用JmsListener配置消费者监听的队列,其中name是接收到的消息
     * @param
     * @return
     */
    @JmsListener(destination = "${myqueue}")
    public void handleMessage(String message) {
        System.out.println("成功接受name: " + message);
    }
}

Topic_Consumer

@Component
public class Topic_Consumer {
    /**
     * 使用JmsListener配置消费者监听的队列,其中name是接收到的消息
     * @param
     * @return
     */
    @JmsListener(destination = "${mytopic}")
    public void handleMessage1(String message) {
        System.out.println("消费者1成功接受: " + message);
    }

    /**
     * 使用JmsListener配置消费者监听的队列,其中name是接收到的消息
     * @param
     * @return
     */
    @JmsListener(destination = "${mytopic}")
    public void handleMessage2(String message) {
        System.out.println("消费者2成功接受: " + message);
    }
}

注意:
使用订阅/发布方式时,需修改配置文件中的 pub-sub-domain 参数 (activeMQ默认使用P2P方式)

同时使用点对点和发布/订阅模式

1.修改配置文件

中的 pub-sub-domain参数为true

2.consumer的启动类
@Bean
    public JmsListenerContainerFactory<?> jmsListenerContainerTopic(@Qualifier("jmsConnectionFactory") ConnectionFactory activeMQConnectionFactory) {
        DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
        bean.setPubSubDomain(true);
        bean.setConnectionFactory(activeMQConnectionFactory);
        return bean;
    }
3.修改Topic_Consumer
@Component
public class Topic_Consumer {
    /**
     * 使用JmsListener配置消费者监听的队列,其中name是接收到的消息
     * @param
     * @return
     */
    @JmsListener(destination = "${mytopic}", containerFactory = "jmsListenerContainerTopic")
    public void handleMessage1(String message) {
        System.out.println("消费者1成功接受: " + message);
    }

    /**
     * 使用JmsListener配置消费者监听的队列,其中name是接收到的消息
     * @param
     * @return
     */
    @JmsListener(destination = "${mytopic}", containerFactory = "jmsListenerContainerTopic")
    public void handleMessage2(String message) {
        System.out.println("消费者2成功接受: " + message);
    }
}
posted @   __先森  阅读(478)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示