文章目录
- 前言
- 工作队列-生产者
- 消费者
- 发布订阅-生产者
- 消费者
- 路由模式
- 通配符模式
- 常见问题
- 应用通信-订单系统
- 物流系统
- 发送对象
- 接收对象
- 总结
前言
工作队列-生产者
工作队列就是多个消费者
1.引入依赖
1.配置
2.生产者
3.消费者
生产者代码
用这个
这样队列就声明好了
这样就成功了
先启动
消费者
就是定义一个监听类,监听有没有消息,有消息的话,就去处理
程序重启的话,消费者就创建好了,立马就会消费的
这样就OK了
这样就是多个消费者了
一个生产者一次性发送多个消息
这样就成功了
两个消费者就有两个channels
ack是消费者,publish是消费者
然后这里还有标签,从1开始的
每一个channel里面开始排序
如果监听的参数类型就是string,那么它就是消息主体
这个就是获取channel了
1.String :返回消息的内容
2. Message ( org.springframework.amqp.core.Message ): Spring AMQP的
Message 类,返回原始的消息体以及消息的属性, 如消息ID, 内容, 队列信息等.
3. Channel ( com.rabbitmq.client.Channel ):RabbitMQ的通道对象, 可以⽤于进⾏更
⾼级的操作,如⼿动确认消息
这几个参数之间顺序没有要求
发布订阅-生产者
就是要自己创建交换机,由交换机来路由
a) Fanout:⼴播,将消息交给所有绑定到交换机的队列(Publish/Subscribe模式)
b) Direct:定向,把消息交给符合指定routing key的队列(Routing模式)
c) Topic:通配符,把消息交给符合routing pattern(路由模式)的队列(Topics模式)
先声明队列,然后是交换机,然后是交换机与队列的绑定
先声明队列,然后是交换机、
但是这里绑定的参数该如何传入进来呢
FanoutExchange的类型只有一个,所以注入进来没有问题
但是Queue的类型有三个,就注入有问题了
而且Queue的类型没有一个叫queue的,所以就会报错
所以要指定名称
现在开始发送消息
消费者
发布订阅模式,每一个队列都对应一个消费者
一般来说一个消费者一个类,但是我们在学习就不用这样
路由模式
交换机类型为Direct时, 会把消息交给符合指定routing key的队列.
队列和交换机的绑定, 不是任意的绑定了, ⽽是要指定⼀个RoutingKey(路由key)
消息的发送⽅在向Exchange发送消息时, 也需要指定消息的RoutingKey
Exchange也不再把消息交给每⼀个绑定的key, ⽽是根据消息的RoutingKey进⾏判断, 只有队列的
RoutingKey 和消息的RoutingKey 完全⼀致, 才会接收到消息
先写生产者代码
我们来完成这个图
现在开始生产者的代码
然后测试一下
然后是消费者代码了
就是监听队列了
通配符模式
Topics 和Routing模式的区别是:
- topics 模式使⽤的交换机类型为topic(Routing模式使⽤的交换机类型为direct)
- topic 类型的交换机在匹配规则上进⾏了扩展, Binding Key⽀持通配符匹配
先声明队列
然后是生产者
然后是消费者
常见问题
虚拟机的类型,和队列的持久化,都是不能修改的,如果要修改的话,就要先删除才行
就是属性不能修改
应用通信-订单系统
作为⼀个消息队列, RabbitMQ也可以⽤作应⽤程序之间的通信. 上述代码⽣产者和消费者代码放在不同的应⽤中即可完成不同应⽤程序的通信.
接下来我们来看, 基于SpringBoot+RabbitMQ完成应⽤间的通信.
需求描述:
⽤⼾下单成功之后, 通知物流系统, 进⾏发货. (只讲应⽤通信, 不做具体功能实现)
把两个系统都放在这个文件夹里面
然后开始发送消息
我们用UUID作为订单id
然后启动
物流系统
就是消费者
发送对象
这样写的话,发送的消息就接收不到了,就打印不出来内容了
但是这样就可以了
加上注解RabbitHandler
注解RabbitHandler的作用就是根据不同的参数,选择不同的方法
而这个参数可以是对象了,现在
先让生产者发送对象
先创建一个对象
这样就发送对象了
这个的原因是orderInfo没有序列化,说的是队列只支持byte数组,string和序列化信息
这样就可以了
这个不好看,消息内容就是patload
我们发送消息的时候,默认会把消息进行转换,就是
就是用这个进行转化,可读性很差
所以我们用json来进行转化
可以在rabbitTemplate设置谁来转化
我们来重新定义一个rabbitTemplate
选这个
我们还有有一个自己的messagecover
我们自己创建了一个rabbitteamplate
那么以后我们Autowired的时候,就是我们自己的teamplate了
这样就成功了
接收对象
注解RabbitHandler就是根据参数类型自己找方法的
一般来说,是把OderInfo提取出来一个单独的包,然后分别引入这个包
但是在同一个文件夹中,就可以直接引入包了,这个是不正规的
然后启动就直接报错了
因为生产者有messagecover,可以转化为json,但是消费者没有messagecover啊
所以我们在消费者这里也要搞一个自己的rabbitTemplate
但是注意的是,虽然消费失败了,但是仍然消费了的,所以还要重新生产消息
因为我们的这个是自动确认的方式,意思就是只要消息到达了消费者,不管消费者是否消费成功,队列都会删除这个消息,这个就是自动确认,要么改成手动确认,或者自己来一个messagecover
string和对象都是可以了
RabbitListener注解加在类上表示,这个类就只监听一个队列
注意,同一个参数类型的方法只能有一个,不然会报错的