前兩篇我們已經初步學習了rabbitmq的使用,這一篇主要講Fanout的使用,如果對Fanout扇形交換機還不太明白的話,建議看一下我的第一篇《RabbitMQ實戰篇:開篇思維導圖》裏面有詳細介紹各個交換機類型。
那麼我們就直接上代碼了:
我們配置了2個Queue ,綁定到同一個exchange中
package com.lwl.rabbitmq.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.lwl.rabbitmq.constant.Constants;
/**
* 發送消息 配置發送消息的隊列queue
* @author lwl
* @create 2018年8月10日 下午2:37:38
* @version 1.0
*/
@Configuration
public class SendMessageConfig {
@Bean
public Queue fanoutQueue() {
return new Queue(Constants.FANOUT_QUEUE);
}
@Bean
FanoutExchange exchange() {
return new FanoutExchange(Constants.FANOUT_NAME);
}
/**
* 使用扇型交換機,routekey
* @param queueMessage
* @param exchange
* @return
* @author lwl
* @create 2019年6月14日 上午10:51:21
*/
@Bean
Binding bindingExchangeMessage(Queue fanoutQueue, FanoutExchange exchange) {
return BindingBuilder.bind(fanoutQueue).to(exchange);
}
/**
* 第二個隊列
* @return
* @author lwl
* @create 2019年6月14日 下午2:11:31
*/
@Bean
public Queue fanoutTwoQueue() {
return new Queue(Constants.FANOUT_QUEUE_TWO);
}
@Bean
Binding bindingExchangeMessageTwo(Queue fanoutTwoQueue, FanoutExchange exchange) {
return BindingBuilder.bind(fanoutTwoQueue).to(exchange);
}
}
看一下我們的生產者:
package com.lwl.rabbitmq.producer;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.lwl.rabbitmq.constant.Constants;
/**
* 生成者
* @author lwl
* @create 2019年6月14日 上午10:56:41
* @version 1.0
*/
@Component
public class Producer {
@Autowired
private AmqpTemplate template;
/**
* 使用扇型交換機
* @param message
* @author lwl
* @create 2019年6月14日 上午10:54:54
*/
public void send(Object message){
template.convertAndSend(Constants.FANOUT_NAME,null,message);
}
}
再看一下我們的消費者,由於有2個隊列,使用有2個消費者
package com.lwl.rabbitmq.consumer;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import com.lwl.rabbitmq.constant.Constants;
/**
* 消費者
* @author lwl
* @create 2019年6月14日 上午10:57:11
* @version 1.0
*/
@Component
@RabbitListener(queues = Constants.FANOUT_QUEUE)
public class FanoutConsumer {
@RabbitHandler
public void process(String hello) {
System.out.println();
System.out.println("-----------------------客戶端 1 收到數據 -----------------------");
System.out.println(Constants.FANOUT_QUEUE+ " --> Receiver1 : " + hello);
System.out.println();
}
}
package com.lwl.rabbitmq.consumer;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import com.lwl.rabbitmq.constant.Constants;
/**
* 消費者
* @author lwl
* @create 2019年6月14日 上午10:57:11
* @version 1.0
*/
@Component
@RabbitListener(queues = Constants.FANOUT_QUEUE_TWO)
public class FanoutConsumer4 {
@RabbitHandler
public void process(String hello) {
System.out.println();
System.out.println("-----------------------客戶端 4 收到數據 -----------------------");
System.out.println(Constants.FANOUT_QUEUE_TWO+ " --> Receiver4 : " + hello);
System.out.println();
}
}
接下來就是我們的測試用例了:
/**
* 發送消息(此時把FanoutConsumer,FanoutConsumer2 ,FanoutConsumer3, FanoutConsumer4 註釋掉)
* @author lwl
* @create 2019年6月14日 下午1:04:10
*/
@Test
public void sendMessage() {
String message = "我是Fanout 發送的消息22222";
producer.send(message);
System.out.println("--------------------------------發送完畢--------------------------------");
System.out.println();
}
我們看到fanout 2個隊列都收到消息,因爲這2個queue都綁定到exchange上。
/**
* 接受消息(此時把FanoutConsumer,FanoutConsumer2 ,FanoutConsumer3, FanoutConsumer4 打開)
* @author lwl
* @create 2019年6月14日 下午1:04:10
*/
@Test
public void getMessage() {
System.out.println("-------------------------------接受數據--------------------------------");
}
運行結果:
-----------------------客戶端 3 收到數據 -----------------------
fanout_queue_2 --> Receiver3 : 我是Fanout 發送的消息22222
-----------------------客戶端 2 收到數據 -----------------------
fanout_queue --> Receiver2 : 我是Fanout 發送的消息22222
我們看到,同一個queue 只能有一個人接收到,但是不同的queue可以相互不影響