这里加一个MQ的应用场景:目的就是为了提升程序运行效率。
eg:
用户登录成功后,发送一条mq,通知用户登录成功!
1. pom.xml文件
<!-- 使用activemq必须:fastjson可以用其他,看喜好 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.35</version>
</dependency>
<!-- activemq -->
<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.6</version>-->
<!--</dependency>-->
</dependencies>
2. springboot配置文件 ( yml文件格式 )
spring:
activemq: ###### activemq 配置
user: admin
password: admin
broker-url: tcp://48.86.111.52:61616 # activemq服务ip,这里我改过ip了,你们连不上
in-memory: true # 是否使用内存存储,提升性能
send-timeout: 10000ms #发送超时时间
close-timeout: 60s #超时关闭时间
pool:
enabled: false #是否启用连接池,如果要使用activemq连接池,需要加依赖包 <artifactId>activemq-pool</artifactId>(不过我试过没有用,可能是版本问题)
# packages:
# trust-all: true #注意:对象传输需开启包白名单 否则会报错(建议这里注释掉,传输字符串)
3. 生产者、消费者模式
生产:
package com.wqm.controller.Common;
import com.alibaba.fastjson.JSON;
import com.wqm.entity.pojo.TUser;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.jms.Destination;
import java.util.Date;
/**
* @author: wangqinmin
* @Date: 2018/10/24 10:37
* @Description: 测试
*/
@RestController
public class MQController {
@Autowired
private JmsMessagingTemplate jmsTemplate;
/**
* 测试: 生产者、消费者模式
*/
@PostMapping("/mqtest")
public void mqTest() {
// wqm.queue --> 自定义需要被监听的队列名
Destination destination = new ActiveMQQueue("wqm.queue");
TUser tUser = new TUser();
tUser.setAge(24);
tUser.setCity("成都");
tUser.setCreatetime(new Date());
tUser.setId(1);
tUser.setSex(2);
tUser.setToken("史上最长的token");
// 将对象转字符串
String message = JSON.toJSONString(tUser);
// 发送异步消息
jmsTemplate.convertAndSend(destination, message);
}
}
消费:
package com.wqm.common.activemq;
import com.alibaba.fastjson.JSON;
import com.wqm.entity.pojo.TUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;
/**
* @Auther: wangqinmin
* @Date: 2018/10/24 10:32
* @Description:
*/
@Service
public class Consumer {
private static final Logger logger = LoggerFactory.getLogger(Consumer.class);
/**
* 使用JmsListener配置消费者监听的队列,其中text是接收到的消息
* @JmsListener(destination = "wqm.queue") 指定要监听的队列
*
* @param text
*/
@JmsListener(destination = "wqm.queue")
public void receiveQueue1(String text) {
// 将字符串转为对象
TUser tUser = JSON.parseObject(text, TUser.class);
System.out.println(tUser.getAge());
System.out.println(tUser.getCity());
System.out.println(tUser.getToken());
}
}
上面步骤适用于 生产消费模式
一般上面就适用于大部分需求了。下面用的很少。
4. 订阅模式(pub/sub模式)
1. 自定义类,开启订阅模式
package com.wqm.common.config.activemq;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.config.SimpleJmsListenerContainerFactory;
import javax.jms.ConnectionFactory;
/**
* @author: wangqinmin
* @date: 2018/10/24 11:56
* @Description: 当使用activemq的订阅模式(pub/sub模式), 配置如下代码,生产消费模式不需要编写该类
*/
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class MyContainerFactory {
@Bean(name = "myJmsContainerFactory")
JmsListenerContainerFactory<?> getJmsListenerContainerFactory(ConnectionFactory connectionFactory) {
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
// 开启订阅模式
factory.setPubSubDomain(false);
return factory;
}
}
生产:
@Autowired
private JmsMessagingTemplate jmsTemplate;
/**
* 测试: 发布、订阅模式
*/
@PostMapping("/mqTest1")
public void mqTest1() {
for (int i = 0; i < 100; i++) {
// 自定义发布端队列名 wqm.topic
Destination destination = new ActiveMQTopic("wqm.topic");
// 发送消息 :"hello, 兄dei (topic)!!!"
jmsTemplate.convertAndSend(destination, "hello, 兄dei (topic)!!!");
}
}
消费:
// 指定监听队列名,和 开启自定义订阅模式
@JmsListener(destination = "wqm.topic", containerFactory = "myJmsContainerFactory")
public void subscriber(String text) {
System.err.println("消费订阅消息=======》:" + text);
}
完工 !!!