**
RabbitMq 廣播模式 – fanout
**
1、將一條消息通過Exchange交換機分發到多個對列中,供多個消費者監聽對列消費消息。
package com.sgcc.base.service.config;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMqConfig {
@Value("${spring.rabbitmq.host}")
public String host;
@Value("${spring.rabbitmq.username}")
public String username;
@Value("${spring.rabbitmq.password}")
public String password;
@Bean
RabbitMqConfig config(){
try {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(host);
factory.setPort(AMQP.PROTOCOL.PORT);
factory.setUsername(username);
factory.setPassword(password);
Connection conn = factory.newConnection();
// 聲明一個交換機,使用FANOUT 持久化交換機(第三個參數)
Channel channel = conn.createChannel();
channel.exchangeDeclare(QueueEnum.FANOUT1.getExchange(), "fanout");
channel.exchangeDeclare(QueueEnum.FANOUT2.getExchange(), "fanout");
channel.exchangeDeclare(QueueEnum.FANOUT3.getExchange(), "fanout");
channel.exchangeDeclare(QueueEnum.FANOUT4.getExchange(), "fanout");
/**
* 隊列名稱
* query中倆個每一個數組中的;倆個隊列都綁定一個共同的交換機
* 將一條消息分別給倆個隊列塞入,供倆個消費者監聽對列消費消息
* 同時有新增的消費者第三方只需要在添加一條隊列。(注:隊列名稱
* 不可以一致,區分開來方便消費者監聽)
*/
String[] queue1 = {"MALL.ORGANIZATION.MKB","MALL.ORGANIZATION.ZZ"};// 1、組織機構
String[] queue2 = {"MALL.DEPT.MKB","MALL.DEPT.ZZ"}; // 2、部門
String[] queue3 = {"MALL.PERSONNEL.MKB","MALL.PERSONNEL.ZZ"}; // 3、人員
String[] queue4 = {"MALL.FACE.MKB","MALL.FACE.ZZ"}; // 4、人臉
/**
*以下的循環方便創建隊列,並將交換機綁定隊列
*/
//組織機構
for (int i = 0; i < queue1.length; i++) {
channel.queueDeclare(queue1[i], true, false, false, null);
//query綁定隊列與Exchange交換機
channel.queueBind(queue1[i], QueueEnum.FANOUT1.getExchange(), "");
}
//部門
for (int i = 0; i < queue2.length; i++) {
channel.queueDeclare(queue2[i], true, false, false, null);
//query綁定隊列與Exchange交換機
channel.queueBind(queue2[i], QueueEnum.FANOUT2.getExchange(), "");
}
//人員
for (int i = 0; i < queue3.length; i++) {
channel.queueDeclare(queue3[i], true, false, false, null);
//query綁定隊列與Exchange交換機
channel.queueBind(queue3[i], QueueEnum.FANOUT3.getExchange(), "");
}
//人臉圖片
for (int i = 0; i < queue4.length; i++) {
channel.queueDeclare(queue4[i], true, false, false, null);
//query綁定隊列與Exchange交換機
channel.queueBind(queue4[i], QueueEnum.FANOUT4.getExchange(), "");
}
channel.close();
conn.close();
}catch (Exception e){
}
return null;
}
}
2、定義枚舉方便更換交換機名稱,其交換機的類型統一爲fanout(廣播模式)一個交換機對應多個隊列。
package com.sgcc.base.service.config;
public enum QueueEnum {
/**
*根據業務來訂多少個mq隊列,從而定義隊列對應的交換機
*/
FANOUT1("organization.fanout"),
FANOUT2("dept.fanout"),
FANOUT3("personnel.fanout"),
FANOUT4("face.fanout");
/**
* 交換名稱
*/
private String exchange;
QueueEnum(String exchange) {
this.exchange = exchange;
}
public String getExchange() {
return exchange;
}
public void setExchange(String exchange) {
this.exchange = exchange;
}
}
3、消息發送,廣播模式,通過綁定交換機將消息發送隊列,所有在使用時不需要routingKey綁定。即使綁定也會忽略。
package com.sgcc.base.service.config;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
// mq消息生產者
//多個消息生產者,則寫多個方法,並且綁定不同的交換機,
//確認是不同隊列,提供不同的消息方便之後業務需求
@Component
public class MqSend {
private org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(this.getClass());
@Autowired
private AmqpTemplate amqpTemplate;
//組織機構消息生成者
public void organizationQueues(String msg){
logger.info("隊列數據==組織機構==>>"+msg);
amqpTemplate.convertAndSend(
//綁定對應的交換機。
QueueEnum.FANOUT1.getExchange(),
"",
msg );
}
}
4、消息消費。只需要知道直接需要那個隊列中的消息,監聽那個隊列即可。
package com.sgcc.base.service.config;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
//消費者
//通過註解方式監聽自己需要的消費的隊列名稱![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200611105012721.png#pic_center)
@Component
public class MqReview {
private org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(this.getClass());
/**
* 部門消費者
* @param msg
*/
@RabbitListener(queues = "MALL.DEPT.MKB")
@RabbitHandler
public void orgQueuesMkb(String msg){
System.out.println("輸出的數據==mkb==部門"+msg);
}
/**
* 部門消費者
* @param msg
*/
@RabbitListener(queues = "MALL.DEPT.ZZ")
@RabbitHandler
public void orgQueuesZz (String msg){
System.out.println("輸出的數據==zz==部門"+msg);
}
}
5、這樣實現了一條消息發送倆個隊列,提供倆個消費者消費。在客戶端也可以更好的看到隊列,交換機,消息的一些信息與狀態。業務需要只要在config中繼續配置隊列就可以增加消費者,繼續配置交換機與隊列就可以增加新的消息隊列。方便更多的消息通知。