编写:HorinJsor
文章目录
前言
此文需要掌握MQ基础,安装rubbitMQ:
黑马 p65
一、SpringAMQP是什么?
Spring AMQP是基于AMQP协议定义的一套API规范,提供了模板来发送和接收消息。包含两部分,其中spring-amqp是基础抽象,spring-rabbit是底层的默认实现。
二、发/收消息操作步骤(简单消息模型)
(此案例是简单消息模型:生产者→消息→队列→消费者)
- 每条消息只能由一个消费者消费
1.在父工程中引入spring-amqp的依赖
<!--AMQP依赖,包含RabbitMQ-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.在publisher服务(生产者)中编写application.yml,添加mq连接信息:
spring:
rabbitmq: #配置mq地址
host: 192.168.150.101 # 主机名
port: 5672 # 端口,注意分别:15672是页面的端口
virtual-host: / # 虚拟主机(环境),mq种查看
username: itcast # 用户名
password: 123321 # 密码
3.在publisher服务(生产者)中发送消息
@SpringBootTest
public class SpringAmqpTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testSimpleQueue() {
String queueName = "simple.queue"; //队列名称
String message = "hello, spring amqp!";
rabbitTemplate.convertAndSend(queueName, message);
}
}
4.在consumer服务(消费者)中编写application.yml,添加mq连接信息:
spring:
rabbitmq:
host: 192.168.150.101 # 主机名
port: 5672 # 端口
virtual-host: / # 虚拟主机
username: itcast # 用户名
password: 123321 # 密码
5.在consumer服务(消费者)中编写消费逻辑
因为是监听器,所以得让整个模块启动起来。
@Component //注入bean,让spring发现
public class SpringRabbitListener {
@RabbitListener(queues = "simple.queue") //监听器,指定监听消息的队列
public void listenSimpleQueueMessage(String msg) throws InterruptedException {
System.out.println("spring 消费者接收到消息 :【" + msg + "】");
}
}
*6.更改消费者机制
如果有50条消息,2个消费者。那么消息接收量会平均分配。(原本机制是先从队列拿,后处理)
想要改变消费者从队列拿取消息的数量,需要配置:
spring:
rabbitmq:
listener:
simple:
prefetch: 1 #处理完一条消息,再从队列拿取
Thread.sleep(20); //Java程序休眠20ms
三、发布订阅模式:发/收消息
- 广播模式,发一次消息,多个消费者接收
1.在consumer服务(消费者)声明Exchange、Queue、Binding(将队列绑定至交换机,也可去网页手动)
@Configuration //声明配置类
public class FanoutConfig {
// 声明FanoutExchange交换机
@Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange("itcast.fanout");
}
// 声明第1个队列
@Bean
public Queue fanoutQueue1(){
return new Queue("fanout.queue1");
}
//绑 定队列1和交换机
@Bean
public Binding bindingQueue1(Queue fanoutQueue1, FanoutExchange fanoutExchange){
return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
}
// ... 略, 以相同方式声明第2个队列,并完成绑定
}
2.收:在consumer服务(消费者)监听类种创建消费者
@RabbitListener(queues = "fanout.queue1")
public void listenFanoutQueue1(String msg) {
System.out.println("消费者1接收到Fanout消息:【" + msg + "】");
}
@RabbitListener(queues = "fanout.queue2")
public void listenFanoutQueue2(String msg) {
System.out.println("消费者2接收到Fanout消息:【" + msg + "】");
}
3.发:在publisher服务(生产者)发送消息到FanoutExchange(交换机)
@Test
public void testFanoutExchange() {
// 队列名称
String exchangeName = "itcast.fanout";
// 消息
String message = "hello, everyone!";
// 发送消息,参数分别是:交互机名称、RoutingKey(暂时为空)、消息
rabbitTemplate.convertAndSend(exchangeName, "", message);
}
四、发布订阅模式扩展方式:DirectExchange的使用
1.收:在consumer服务(消费者)中,编写消费者方法,分别监听不同队列
//通过监听注解,声明队列、交换机、暗号(key)
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "direct.queue1"),
exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
key = {"red", "blue"}
))
public void listenDirectQueue1(String msg){
System.out.println("消费者1接收到Direct消息:【"+msg+"】");
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "direct.queue2"),
exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
key = {"red", "yellow"}
))
public void listenDirectQueue2(String msg){
System.out.println("消费者2接收到Direct消息:【"+msg+"】 ");
}
2.发:在publisher服务发送消息到DirectExchange
@Test
public void testDirectExchange() {
// 队列名称
String exchangeName = "itcast.direct";
// 消息
String message = "红色警报!日本乱排核废水,导致海洋生物变异,惊现哥斯拉!";
// 发送消息,参数依次为:交换机名称,RoutingKey,消息
rabbitTemplate.convertAndSend(exchangeName, "red", message);
}
更多方式请了解:通配符交换机的使用 p75
五、消息转换器(发送消息类型为对象)
1.父工程引入依赖:jackson序列化依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
2.生产者中配置(可以在启动类)
@Bean
public MessageConverter jsonMessageConverter(){
return new Jackson2JsonMessageConverter();
}
3.消费者中:
总结
冲