我们再来编写生产者,Provider,这里我们已经把消费者给写好了,一个SmsReceiver,一个PushReceiver,
先改一下,这是push receiver
@RabbitHandler
public void process(String msg){
System.out.println("Push..........receiver: "+msg);
}
这样笔记里要重新替换一下,Consumer写好以后呢,我们回过来看Provider的写法,Provider的配置文件已经改好了,
我们把交换器的名称交换一下就可以了,然后我们再看sender这个类,在这个类当中呢,我们取交换器的名称,然后这里
没有路由键了,就可以把这个删掉,那么没有路由键了,在发送消息的时候,对于convertAndSend方法的第二个参数,
我们该怎么去办呢,注意,这里我们只要给空串就可以了,没有路由键的,我们只要给空串就可以了,这样我们的消息发送者,
就会交给我们的fanout交换器
public void send(String msg){
//向消息队列发送消息
//参数一:交换器名称。
//参数二:路由键
//参数三:消息
this.rabbitAmqpTemplate.convertAndSend(this.exchange,"", msg);
}
fanout交换器再把消息广播到其他的队列当中,所以这块需要注意,把路由键去掉,换乘空串就可以了,接下来我们就来测试
一下,如果我们的服务端,Sender,发送一条数据,这条数据能不能同时发送到PushReceiver和SmsReceiver当中,我们先把消费者
启动,观察控制台,我们再去运行我们的测试代码,Provider的测试代码,这块我们也不用死循环了,直接发送Hello RabbitMQ,
我们来运行,观察控制台,我们可以看到,现在SMS Receiver和Push Receiver同时收到消息了
Push..........receiver: Hello RabbitMQ
Sms........receiver: Hello RabbitMQ
也就是说我现在这个消息,广播到了两个队列当中,这个不就是订阅两个队列对象吗,我们就直接输出两个相同的东西,
是不是Hello Rabbit其实最后你会发现,Fanout交换器,最大的区别,跟我们之前讲的Direct,和Topic,他们最大的区别是什么呢,
他并不会通过路由键的特点,去发送的一个过程,因为他没有路由键,没有路由键的是通过广播的方式发送到所有的队列当中,
那么其他的消息订阅者这一块,也不需要有路由键,因为一旦有路由键,就是从某个特定的队列了,所以这块需要注意,我们把
Provider的代码copy一下,还是比较简单的,只要改动一个地方,把路由键换成空串就可以了,把它整理到笔记当中,测试代码
什么都不用动,那我们的fanout交换器就讲解完了,希望能对这三种交换器,通过这三个案例呢,有一个本质上的一个认识,
区别,然后我们在开发的过程当中呢,可以根据自己的开发情况,需求,来决定,用哪种交换器来传递消息
4.0.0
com.learn
rabbitmq-fanout-provider
0.0.1-SNAPSHOT
jar
org.springframework.boot
spring-boot-starter-parent
1.5.12.RELEASE
UTF-8
UTF-8
1.8
3.0.9.RELEASE
2.2.2
org.springframework.boot
spring-boot-starter-amqp
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
spring.application.name=rabbitmq-fanout-provider
spring.rabbitmq.host=59.110.158.145
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
mq.config.exchange=order.fanout
package com.learn;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class RabbitFanoutProviderApplication {
public static void main(String[] args) {
SpringApplication.run(RabbitFanoutProviderApplication.class, args);
}
}
package com.learn.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.learn.RabbitFanoutProviderApplication;
import com.learn.Sender;
/**
* 消息队列测试类
* @author Administrator
*
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes=RabbitFanoutProviderApplication.class)
public class QueueTest {
@Autowired
private Sender sender;
/*
* 测试消息队列
*/
@Test
public void test1(){
this.sender.send("Hello RabbitMQ");
}
}