需求
当订单服务向交换器发送请求的时候,需要短信服务和push服务进行工作,如果使用传统的服务调用的话,是强耦合不利于扩展开发,此时可以使用RabbitMQ提供的交换器中的Fanout(广播模式)进行解决,中间件通过广播模式同时将请求放入订单服务的队列中。进行业务的处理
fanout不会进行路由键匹配的进行消息的发送,而是以广播的方式将消息发送到所有的队列中,所以不管是消费端还是生产端都不需要路由键的存在
Consumer构建
1.全局配置文件
1.设置交换器的名字
2.设置队列的名称,fanout不需要进行设置路由键
spring.rabbitmq.host=192.168.177.140
spring.rabbitmq.port=5672
spring.rabbitmq.username=oldlu
spring.rabbitmq.password=123456
spring.application.name=08-rabbitmq-fanout-cunsumer
#配置交换器的名字
spring.rabbitmq.exchange.name=order-topic
#设置短信队列名称
spring.rabbitmq.queue.sms=order-sms
#设置push队列名称
spring.rabbitmq.queue.push=order-push
2.创建队列类
SMS队列
fanout是不需要路由的
SmsQueue
@Component
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "${spring.rabbitmq.queue.sms}"),
exchange = @Exchange(value = "${spring.rabbitmq.exchange.name}",type = ExchangeTypes.FANOUT)
)
)
public class SmsQueue
{
@RabbitHandler
public void sms(String msg){
System.out.println("fanout...."+msg);
}
}
pushQueu
@Component
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "${spring.rabbitmq.queue.push}"),
exchange = @Exchange(value = "${spring.rabbitmq.exchange.name}",type = ExchangeTypes.FANOUT)
)
)
public class PushQueue
{
@RabbitHandler
public void push(String msg){
System.out.println("push...."+msg);
}
}
provider
1.全局配置文件
只需要添加交换器的名字即可
spring.rabbitmq.host=192.168.177.140
spring.rabbitmq.port=5672
spring.rabbitmq.username=oldlu
spring.rabbitmq.password=123456
spring.application.name=09-rabbitmq-fanout-provider
#配置交换器的名字
spring.rabbitmq.exchange.name=order-topic
2.信息的发送
使用fanout进行设置的时候路由key值给空字符串即可
@Component
public class Sender
{
@Autowired
private RabbitTemplate rabbitTemplate;
@Value("${spring.rabbitmq.exchange.name}")
private String exchange;
public void send(String msg){
/**
* 路由键给空字符串即可
*/
this.rabbitTemplate.convertAndSend(this.exchange, "",msg);
}
}
结果