首先要讲什么是ActiveMQ:AciveMQ是Apache出品的目前最流行,能力强劲的开源消息总线
主要功能:
1、 解决服务之间代码耦合
2、 使用消息队列,增加系统并发处理量
主要应用场景:
1、 当系统使用短信平台、邮件平台的时候。
2、 当系统使用搜索平台、缓存平台的时候。
总结一下就是使用MQ作为系统间数据调用的中转站
在Spring Boot中集成ActiveMQ相对还是比较简单的,都不需要安装什么服务,SpringBoot内置是提供了AciveMQ的,默认使用内存的activeMQ,当然配合外置ActiveMQ Server会更好。
使用外置ActiveMQ 流程:
首先你需要去官网下一个 ps:楼主用的是5.14.2版本的 现在官网最新版是5.15.8
安装包下载完成后解压后 就是这个样子了 (注意一定要解压到全英文路径下的包内)
打开你的bin目录
打开你系统对应位数的目录,熊局长的是64位的
双击activemq.bat启动
点完之后会自动弹出来doc启动,稍等一下 如果你最后跟我的一样 说明启动成功了
启动成功之后,在你的浏览器中访问http://localhost:8161/ 就能访问到ActiveMq的页面咯
点击画红线的选项,会弹出一个登陆框,账号和密码都是 admin
登陆成功后就是这样子了,会有两个队列,topic 和 queue队列 点进去就能查看详情,如果你在后台创建队列 这边就会实时显示 让你查看
要注意
ActiveMQ使用的是标准生产者和消费者模型
1、Queue 队列(P2P消息模型) ,生产者生产了一个消息,只能由一个消费者进行消费 :给微信好友发消息
2、Topic 主题/广播(Pub/Sub消息模型),生产者生产了一个消息,可以由多个消费者进行消费
后端:
在SpringBoot中整合ActiveMQ是非常简单的
1:在你的pom.xml中导入依赖
<!-- ActiveMQ的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
2.在application.properties中添加mq的配置
# MQ所在的服务器的地址
spring.activemq.broker-url=tcp://127.0.0.1:61616
# 是否使用内置的MQ, true 使用; fale 不使用
spring.activemq.in-memory=false
# 是否在回滚回滚消息之前停止消息传递。这意味着当启用此命令时,消息顺序不会被保留。
spring.activemq.non-blocking-redelivery=false
# 用户名
spring.activemq.password=admin
# 密码
spring.activemq.user=admin
3.在你需要编写生产者和消费者的系统中都要创建你的ActiveMQConfig
package com.czxy.config;
import javax.jms.Queue;
import javax.jms.Topic;
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 ActiveMQConfig {
@Bean
public Queue queue() {
return new ActiveMQQueue("czxy.queue");
}
@Bean
public Topic topic() {
return new ActiveMQTopic("czxy.topic");
}
}
消息的生产者:
/**
* 消息的生产者
* @author Administrator
*
*/
@Componet
@EnableScheduling
public class QueueProducer {
/*
* @Autowired // 也可以注入JmsTemplate,JmsMessagingTemplate对JmsTemplate进行了封装
* private JmsMessagingTemplate jmsTemplate; //
* 发送消息,destination是发送到的队列,message是待发送的消息
*
* @Scheduled(fixedDelay=3000)//每3s执行1次
public void sendMessage(Destination destination, final String message){
jmsTemplate.convertAndSend(destination, message);
}
*/
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private Queue queue;
@Scheduled(fixedDelay=3000)//每3s执行1次
public void send() {
try {
MapMessage mapMessage = new ActiveMQMapMessage();
mapMessage.setString("info", "你还在睡觉");
this.jmsMessagingTemplate.convertAndSend(this.queue, mapMessage);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
消息的消费者:
/**
* 消息的消费者
* @author Administrator
*/
@Component
public class QueueConsumer {
//使用JmsListener配置消费者监听的队列,其中Message是接收到的消息
@JmsListener(destination = "czxy.queue")
public void receiveQueue(Message message) {
try {
MapMessage mapMessage = (MapMessage) message;
String info = mapMessage.getString("info");
System.out.println(info);
} catch (Exception e) {
e.printStackTrace();
}
}
}
启动,测试,ok
需要注意事项
根据需要创建一个ActiveMQ的生成者,在创建生产者的项目内创建一个ActiveMQconfig在config中定义好ActiveMQ的队列名
在需要接受的地方创建一个消费者,这个消费者的名字一定要根据对应生产者config的对列名,
需要注意事项:创建消费者的监听类的时候一定要记得在类名上添加@Component注释以启动监听状态,否则是找不到消费者的客要讲的就是怎么采用外置的ActiveMQ,