SpringBoot整合ActiveMQ

参考:
https://blog.csdn.net/qq_22200097/article/details/82713261
https://blog.csdn.net/qq_22200097/article/details/82716859

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。消息形式支持点对点和订阅-发布。

ActiveMQ是什么

ActiveMQ是消息队列技术,为解决高并发问题而生
ActiveMQ生产者消费者模型(生产者和消费者可以跨平台、跨系统)

ActiveMQ支持如下两种消息传输方式

点对点模式:生产者生产了一个消息,只能由一个消费者进行消费。消费者可以随时拿到所有消息,包含历史消息。
发布/订阅模式:生产者生产了一个消息,可以由多个消费者进行消费。消费者只能拿到自己启动监听后生产者发布的消息,拿不到历史消息。

SpringBoot整合ActiveMQ

1. ActiveMQ下载和启动

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

Number Of Pending Messages:消息队列中待处理的消息
Number Of Consumers:消费者的数量
Messages Enqueued:累计进入过消息队列的总量
Messages Dequeued:累计消费过的消息总量

SpringBoot整合ActiveMQ_第1张图片
image.png

2. 创建springboot项目,作为消息提供者(provider)

2.1 pom.xml中添加依赖
SpringBoot整合ActiveMQ_第2张图片
image.png
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-activemq
        
2.2 application.properties代码
server.port=8080

spring.activemq.broker-url=tcp://localhost:61616
#true 表示使用内置的MQ,false则连接服务器
spring.activemq.in-memory=false
#如果是点对点(queue),那么此处默认应该是false,如果发布订阅,那么一定设置为true
spring.jms.pub-sub-domain=false
2.3 ActivemqProviderApplication.java代码:
package com.wzf.activemq_provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.jms.annotation.EnableJms;

@SpringBootApplication
@EnableJms
public class ActivemqProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ActivemqProviderApplication.class, args);
    }

}
2.4 BeanConfig.java代码:
package com.wzf.activemq_provider.config;

import javax.jms.Queue;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class BeanConfig {

    @Bean
    public Queue queue(){
        return new ActiveMQQueue("queue1");
    }

    @Bean
    public ActiveMQTopic topic(){
        return new ActiveMQTopic("topic1");
    }
}

2.5 ProviderController.java
package com.wzf.activemq_provider.controller;

import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.jms.Queue;

@RestController
public class ProviderController {

    //注入存放消息的队列,用于下列方法一
    @Autowired
    private Queue queue;

    @Autowired
    private ActiveMQTopic topic;

    //注入springboot封装的工具类
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;


    @GetMapping("send")
    public void send(@RequestParam String name){
        //方法一:添加消息到消息队列
        jmsMessagingTemplate.convertAndSend(queue, name);

        //方法二:这种方式不需要手动创建queue,系统会自行创建名为test的队列
        //jmsMessagingTemplate.convertAndSend("test", name);
    }

    @GetMapping("send2")
    public void send2(@RequestParam String name){
        //方法一:添加消息到消息队列
        jmsMessagingTemplate.convertAndSend(topic, name);

        //方法二:这种方式不需要手动创建topic,系统会自行创建名为topic的队列
        //jmsMessagingTemplate.convertAndSend("topic", name);
    }
}
2.6 测试

启动生产者程序后,打开浏览器,分别输入地址
http://localhost:8080/send?name=3
http://localhost:8080/send?name=3
http://localhost:8080/send?name=3
成功添加3条消息

SpringBoot整合ActiveMQ_第3张图片
image.png

3. 创建springboot项目,作为消息消费者(consumer)

3.1 pom.xml中添加依赖
SpringBoot整合ActiveMQ_第4张图片
image.png
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-activemq
        
3.2 application.properties代码
server.port=8081

spring.activemq.broker-url=tcp://localhost:61616
#true 表示使用内置的MQ,false则连接服务器
spring.activemq.in-memory=false
3.3 ActivemqConsumerApplication.java代码:
package com.wzf.activemq_consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.jms.annotation.EnableJms;

@SpringBootApplication
@EnableJms
public class ActivemqConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ActivemqConsumerApplication.class, args);
    }
}
3.4 ConsumerService.java代码:
package com.wzf.activemq_consumer.service;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Component;

@Component
public class ConsumerService {

    // 使用JmsListener配置消费者监听的队列,其中name是接收到的消息
    @JmsListener(destination = "queue1")
    // SendTo 会将此方法返回的数据, 写入到 OutQueue 中去
    @SendTo("OutQueue")
    public String handleMessage(String name){
        System.out.println("成功接收到name:" + name);
        return "name:" + name;
    }
}
3.5 测试

启动消费者程序


SpringBoot整合ActiveMQ_第5张图片
image.png
SpringBoot整合ActiveMQ_第6张图片
image.png

4、前端使用websocket调用消息队列

test.html的代码:

    
    
        
        
        
    

分别启动前端web容器和消息提供者的后台服务,然后在网址栏中输入:

http://localhost:8080/send?name=111,
http://localhost:8080/send2?name=222
发送一条消息,在前端程序的控制台可以看到:

SpringBoot整合ActiveMQ_第7张图片
image.png

你可能感兴趣的:(SpringBoot整合ActiveMQ)