整合
生产者
默认如果在windows安装了rabbitmq是不用配置信息的,因为存在默认的配置
-
整合流程:
- 导包----------编写配置-----------写代码
- 在springboot中存在很多template,MQ 就是其中的一种
- 导包----------编写配置-----------写代码
-
导包
- 其实不需要导包,在创建springboot项目时,勾选MQ,就可以了
-
编写配置
-
#rabbitMQ spring: rabbitmq: username: admin password: admin virtual-host: / host: 47.120.50.213 port: 5672
-
-
配置RabbitMqConfiguration
-
交换机----队列----队列绑定交换机
-
声明交换机
-
@Bean public FanoutExchange fanoutExchange() { //返回的是交换机的名字 return new FanoutExchange("fanout_message_exchange"); }
-
什么类型的交换机,就返回什么类型
-
-
声明队列
-
@Bean public Queue emailQueue() { //也是队列的名字 return new Queue("email.fanout.queue",true); }
-
-
队列绑定交换机
-
@Bean public Binding emailBinding() { return BindingBuilder.bind(emailQueue()).to(fanoutExchange()); }
-
要是是路由模式,可以添加一个路由,
-
@Bean public Binding wxBinding1(){ return BindingBuilder.bind(wxQueue()).to(directExchange()).with(""); }
-
-
-
-
发送消息
-
@Autowired RabbitTemplate rabbitTemplate; public void makeOrder(){ String exchangeName = "fanout_message_exchange"; String message = "hello world"; String routingKey = ""; rabbitTemplate.convertAndSend(exchangeName,routingKey,message); System.out.println("消息发送成功"); }
-
消费者
-
创建一个新的模块
-
导包
-
编写配置
-
创建一个接受的service
-
@RabbitListener(queues = {"wx.fanout.queue"}) @Service public class FanoutReceiver { private String messageContent; @RabbitHandler public void receive(String message) { messageContent = message; } public String getMessageContent(){ return messageContent; } }
-
还是一样,接收者是通过队列来进行接受的
-
@RabbitListener()
-
RabbitHandler得到的message就是消息
-
思考?
如何实现路由模式的配置
@Bean
public Binding tiktokQueueBinding() {
return BindingBuilder.bind(tiktokQueue()).to(directExchange()).with("tikTokQueueDirect");
}
在后面加上With就行
问题:
如果把接收与发送服务为了测试,写在一个类中,那么其实都不用调用服务,当启动后,就会一直监听,然后消费服务,所以你看不到服务的消费
配置类
写在消费者这边还是在生产者这边比较好?
回答:都是推荐的【生产者、消费者、两边】,但是配置在消费者更好一点,消费者一般是先启动的,交换机,让交换机时时监听
使用注解开发
这样可以不使用配置了
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "email.fanout.queue",durable = "true",autoDelete = "false"),
exchange = @Exchange(value = "fanout_message_exchange",type = ExchangeTypes.FANOUT)
))
关于为什么可以这么写?
解释:
-
进入@RabbitListener
-
进入QueueBinding
-
进入Queue
以上就是可以这样配置的原因了