标签:springboot ll springframework RabbitMQ org import ActiveMQ
文章目录
1 消息中间件介绍
1.两个重要的规范JMS和AMQP
JMS(Java Message Service),java通信的规范,统一java api层面的标准,规范写法。
AMQP,不是从api层面去规范的,是从协议的层面去规范发消息和解析消息,不管什么语言,只要遵守这个规范,就可以使用AMQP。比较有代表的是RabbitMQ。
2.什么是消息中间件
消息中间件是一种跨线程通信的方式
3.优点
能够很好地实现服务的调用者和消费者的解耦
发邮件是一个耗时的操作,是单线程,发完邮件后不可能等着发成功后响应,对于系统而言,有很多个模块都需要发邮件,可以把邮件服务抽取出来,单独做一个项目,从消息中间件中提取数据。哪个模块想发邮件,就往消息中间件发一条信息,另一个模块自动从消息中间件中读取信息发送邮件。
如果采用多线程的话,发邮件就跟服务绑定在了一起,不好扩展。
2 JMS之ActiveMQ
1.准备工作
1.ActiveMQ下载
2.启动
在bin目录下输入activemq start命令启动
F:\activemq\apache-activemq-5.16.2\bin>activemq start
3.访问网址
8161是管理客户端的端口号,61616是通信的端口号
http://localhost:8161/
默认用户名和密码都是:admin
2.springboot中使用ActiveMQ
1.创建springboot项目
依赖选择web和ActiveMQ5
2.在application.yml中配置相关参数
spring:
activemq:
broker-url: tcp://127.0.0.1:61616 # 61616是通信端口号
packages:
trust-all: true # 信任所有的包
user: admin # 客户端的账户
password: admin # 客户端的密码
3.在springboot的main方法所在类定义一个消息队列
package com.ll;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import javax.jms.Queue;
@SpringBootApplication
public class JmsApplication {
public static void main(String[] args) {
SpringApplication.run(JmsApplication.class, args);
}
// 消息队列
@Bean
Queue queue(){
return new ActiveMQQueue("ll-Queue");
}
}
4.创建JMS的组件
package com.ll.config;
import com.ll.model.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;
import javax.jms.Queue;
// 在组件里实现消息的发送和接收
@Component
public class JmsComponent {
// springboot已经帮我们做了自动化配置,所以在这里面直接注入消息发送模板
@Autowired
JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
Queue queue;
// 发信息
public void sendMessage(Message message){
// 发到哪里去queue,发送内容message
jmsMessagingTemplate.convertAndSend(queue,message);
}
// 接收信息
// JmsListener会时刻监听消息队列,一旦,队列里有消息就会打印出来
@JmsListener(destination = "ll-Queue") // 确定该消息是接收信息的
public void receive(Message message){
System.out.println("msg:" +message);
}
}
4.发送邮件
先运行一个项目
再运行一个发送邮件的单元测试,当发送邮件后,前一个项目的控制台会打印出信息
package com.ll;
import com.ll.config.JmsComponent;
import com.ll.model.Message;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
@SpringBootTest
class JmsApplicationTests {
@Autowired
JmsComponent jmsComponent;
@Test
void contextLoads() {
Message message = new Message();
message.setContent("哈哈哈哈哈哈哈哈哈哈");
message.setDate(new Date());
jmsComponent.sendMessage(message);
}
}
5.该例子的完整项目代码
3 AMQP之RabbitMQ
1.准备工作
1.使用 Docker 安装 RabbitMQ
2.在linux服务器上安装Docker
# 首先安装 Docker
yum -y install docker
# 然后启动 Docker 服务
service docker start
# 测试安装是否成功
docker -v
3.在安装Docker的linux上,安装RabbitMQ
查看仓库里的RabbitMQ
docker search rabbitmq
安装RabbitMQ
docker pull rabbitmq
启动RabbitMQ
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq
先执行docker ps 拿到当前的镜像ID
进入容器
安装插件
ctrl+p+q退出当前容器
docker ps
docker exec -it 镜像ID /bin/bash
rabbitmq-plugins enable rabbitmq_management
4.客户端window机访问RabbitMQ后台网页
http://linuxip地址:15672,这里的用户名和密码默认都是guest
2.springboot中使用RabbitMQ
1.创建springboot工程,添加依赖
添加web和RabbitMQ的依赖
3.配置RabbitMQ
通信端口5672,15672管理页面端口
4.交换机
交换机概念:
所有生产的消息都会交给交换机exchange,exchange根据不同的策略将信息发送到RabbitMQ里面去。
四种策略:
Direct exchange、Fanout exchange、Topic exchange、Headers exchange(使用频率相对低)。
1.Direct exchange直来直去的交换机
路由策略:把消息队列绑定到Direct exchange上面,当消息到达时,会转发到相应的routing key上面,跟ActiveMQ点对点发送差不多,给一个队列就可以了,跟交换机的关系并不大。
1.创建消息队列
如果用了Direct 模式,可以不使用DirectExchange Bean和Binding Bean。
// DirectConfig.java
package com.ll.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DirectConfig {
@Bean
Queue directQueue(){
return new Queue("ll-directQueue");
}
// 如果用了Direct 模式,可以不使用DirectExchange Bean和Binding Bean。
// @Bean
// DirectExchange directExchange(){
// // durable:重启后是否有效 autoDelete:长期未使用是否自动删除
// return new DirectExchange("ll-direct",true,false);
// }
//
// // 将队列Queue和交换机DirectExchange绑定到一起
// @Bean
// Binding binding(){
// return BindingBuilder.bind(directQueue()).to(directExchange()).with("direct");
// }
}
2.消息接收
// DirectRecevier.java
package com.ll.recevier;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
// 消息接收
public class DirectRecevier {
@RabbitListener(queues = "ll-directQueue")
public void handlerDirect(String message){
System.out.println("msg: "+message);
}
}
3.单元测试发送信息
package com.ll;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class AmqpApplicationTests {
@Autowired
RabbitTemplate rabbitTemplate;
@Test
void contextLoads() {
rabbitTemplate.convertAndSend("ll-directQueue","哈哈哈哈哈");
}
}
标签:springboot,ll,springframework,RabbitMQ,org,import,ActiveMQ 来源: https://blog.csdn.net/qq_38190823/article/details/117385631
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。