Fanout:广播 (会把消息发送到该交换机下绑定的所有队列中)

Direct:路由

Topic:话题

Fanout:广播使用步骤:

首先在消息接收springboot微服务项目中创建一个Fanout类型的交换机的配置类;

@Configuration

public class FanoutConfig {

//声明FanoutExchange交换机

@Bean

public FanoutExchange fanoutExchange(){

return new FanoutExchange("itcast.fanout");//itcast.fanout为交换机名称

//声明第1个队列

@Bean

public Queue fanoutQueue1(){

return new Queue("fanout.queue1");//fanout.queue1为队列名称

}

//绑定队列1和交换机

@Bean

public Binding bindingQueue1(Queue fanoutQueue1,FanoutExchange fanoutExchange){

return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);

}

//声明第2个队列

@Bean

public Queue fanoutQueue2(){

return new Queue("fanout.queue2");

}

//绑定队列1和交换机

@Bean

public Binding bindingQueue2(Queue fanoutQueue2,FanoutExchange fanoutExchange){

return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);

}

//有多个消息队列就一次添加即可

}

发送消息到交换机,有交换机把消息发送给旗下绑定的所有队列中;

public void sendFanoutExchange() {

//队列名称

String exchangeName ="itcast.fanout":

String message = "我是个大傻瓜!".

//发送消息,参数分别是:交互机名称、RoutingKey(暂时为空)、消息内容

rabbitTemplate.convertAndSend(exchangeName,"",message);

}

接收消息:

@RabbitListener(queues ="fanout.queue1")

public void listenFanoutQueue1(String msg) {

System.out.println("消费者1接收到Fanout消息:【"+msg+"】");

@RabbitListener(queues ="fanout.queve2")

public void listenFanoutQueue2(String msg) {

System.out.println("消费者2接收到Fanout消息:【"+msg+"】")

Direct:路由可以指定要发送的队列:

需要为每个队列创建一个或多个key,交换机发送消息时根据key来选择要发送到的队列,当然不同的队列可以设置相同的key,这样其实也就实现上面的Fanout广播模式;

实现: 这里用注解的方式生成交换机队列和队列的key并绑定 在接收消息的类中添加如下代码;既是创建也是接受;

@RabbitListener(bindings=@QueueBinding(

value =@Queue(name ="direct.queve1"),

exchange =@Exchange(name ="itcast.direct",type=ExchangeTypes.DIRECT), key = {"red", "blue"}

))//这里有red和blue两个key只要在发送消息中有两个key中的任何和一个就会接收到消息

public void listenDirectQueve1(string msg){

System.out.println("消费者接收到direct.queue1的消息:【"+msg+"】");}

发送消息

@Test

public void testSendDirectExchange() {

//交换机名称

String exchangeName ="itcast.direct";

String message = "hello, blue!".//发送消息内容

rabbitTemplate.convertAndSend(exchangeName, "blue", message);}//blue为队列的key,这里是向key是blue的队列发送消息

Topic:话题,该模式和Direct:路由模式相似,

区别在于队列的key在设置多个时每个之间要用点隔开没错是"."; 比如:可以为一个队列设置一个:china.news.sports和 usa.news.it 顾名思义就是中国新闻体育和美国新闻it 比如我现在要发送一个新闻不管是中国美国不管是体育还是it都要收到,我就可以这样写发送的key, “#.news.#” #为通配符表示所有的意思;

依然用注解的方式创建爱你队列交换机和队列的key

@RabbitListener(bindings=@QueueBinding(

value = @Queue(name ="topic.queue1"),

exchange = @Exchange(name ="itcast.topic", type = ExchangeTypes.TOPIC), key="china.#"

))//意思是凡是有china可以的消息都能收到

public void listenTopicQueue1(String msg){

System.out.println("消费者接收到topic.queue1的消息:【"+ msg +"】");}

发送消息

@Test

public void testSendTopicExchange(){

//换机名称

String exchangeName ="itcast.topic";

String message ="我是个大傻瓜!";//发消息

rabbitTemplate.convertAndSend(exchangeName, routingKey: "china.news", message);//china.news意思是发送到队列key是china又是news的队列中,上面我们定义接收的key为china.#他就可以接受到

}

精彩链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: