利用Rabbit MQ 實現一對多通知功能(動態新增刪除佇列交換機)
樓主在專案中需要實現分散式lucene查詢,由於lucene的索引是存放在本地的。網上有很多方案實現起來相對比較複雜,故樓主為了簡單化針對索引同步問題採用的方案是,如果某一結點發生索引的增刪改,通過rabbitmq通知所有lucene節點也進行本地的索引的更改。
fanout型別的exchange雖然可以通知所有佇列,但一個佇列只能繫結一個消費者(如果繫結多個消費者,只要有一個消費者消費了這個訊息,其他的消費者就獲得不到這個訊息了,至於手動ask經測試不行,具體原因沒有細看),然後受spring cloud bus的啟發,每個lucene例項都繫結一個獨立的佇列,所有的佇列繫結到同一個exchange,從而實現一對多通知的功能。
同時,考慮到上線和拓展的便捷性,要求佇列的新增和繫結全部動態自動完成。程式碼邏輯不復雜,只是有些類不常用,網上的資料相對較少,故把完整原始碼貼出來,供大家學習交流。程式碼質量不高,如有錯誤歡迎大家及時指正!
package com.unionpay.wash.lucene_service.MQListener;
import com.rabbitmq.http.client.domain.QueueInfo;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.core.RabbitManagementTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.UUID;
@Component
public class MQListener implements CommandLineRunner {
@Autowired
private RabbitTemplate template;
@Autowired
private AmqpAdmin admin;
private static String queueName;
@Override
public void run(String... args) throws Exception {
RabbitManagementTemplate managementTemplate = new RabbitManagementTemplate();
String exchangeName = "lucene_exchange";
Exchange exchange = managementTemplate.getExchange(exchangeName);
if (exchange == null) {
managementTemplate.addExchange(new FanoutExchange(exchangeName));
}
List<QueueInfo> queues = managementTemplate.getClient().getQueues();
for (QueueInfo queueInfo : queues){
String s = queueInfo.getName();
String idleSince = queueInfo.getIdleSince();
if (queueInfo.getConsumerCount() == 0 && s.contains("lucene_index") && idleSince != null){
managementTemplate.deleteQueue(new Queue(s));
}
}
queueName = "lucene_index_"+UUID.randomUUID();
managementTemplate.addQueue(new Queue(queueName));
Binding binding = BindingBuilder.bind(new Queue(queueName)).to(new FanoutExchange(exchangeName));
admin.declareBinding(binding);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true){
try{
Object o = template.receiveAndConvert(queueName,100);
if (o == null){
Thread.sleep(1000);
}else{
//TODO
}
}catch (InterruptedException e){
e.printStackTrace();
}catch (AmqpException e){
managementTemplate.addQueue(new Queue(queueName));
BindingBuilder.bind(new Queue(queueName)).to(new FanoutExchange(exchangeName));
}
}
}
});
thread.start();
}
}
相關推薦
利用Rabbit MQ 實現一對多通知功能(動態新增刪除佇列交換機)
樓主在專案中需要實現分散式lucene查詢,由於lucene的索引是存放在本地的。網上有很多方案實現起來相對比較複雜,故樓主為了簡單化針對索引同步問題採用的方案是,如果某一結點發生索引的增刪改,通過rabbitmq通知所有lucene節點也進行本地的索引的更改。
C語言:實現一個通訊錄,可以進行增刪查改等多項功能(動態版本)
基於前一篇文章的靜態通訊錄,新增malloc函式,realloc函式以及free,將其改變為一個動態的通訊錄,可以動態記憶體開闢,儘可能防止記憶體的浪費。 具體程式碼如下: contact.h #ifndef __CONTACT_H__ #define __CO
Vue中BootStrap實現表格分頁功能(頁碼過多時帶省略號)
1、首先需要在vue-cli專案中配置bootstrap,jquery 2、 然後新建vue檔案,如index.vue,index.vue內容如下: 3、配置路由即可執行實現。 <template> <div class="tTable cont
JS實現點選複製功能(完美解決移動端可用)
先看一下效果圖 使用此方法不需要轉換什麼<p>標籤,直接就使用<textarea>標籤,就是把它的樣式修改了一下,將背景和邊框都改為你要的顏色就可以了 上程式碼: //
利用iis虛擬目錄實現文件服務器功能(分布式存儲)
clas mage 自己的 關於 彈出 fig文件 images span sdn 要求說明: 通過網站上傳文件保存到統一的文件服務器上。 服務器說明: 1.文件服務器以下稱為FilesServer,IP地址為:192.168.1.213 2.Web服
2.2、Hibernate用註解方式實現一對多、多對多關系
tab 技術部 employee join incr 無法運行 hset strategy urn 一、一對多關系 1、在上一篇日誌中用.xml配置文件項目基礎上,再往lib目錄先添加一個包-hibernate-jpa-2.0-api-1.0.0.Final.jar
Python 使用socket實現一對多通信
line IE art creat enc 創建線程 lac ket grid 這個折磨了我快一天的時間,查看官網的socket入門例子,都是一對一的,服務器是處理一對一的形式。如果讓服務器處理多個客戶端,使用Python提供的socketserver函數和select也是
【筆記】Mybatis高階查詢(四)--使用resultMap的<collection>標籤實現一對多和多對多查詢
<collection>集合的巢狀結果對映就是指通過一次SQL查詢將所有的結果查詢出來,然後對映到不同的物件中。在一對多的關係中,主表一條資料會對應關聯表的多條資料。因此一般查詢時會查詢出多條結果,按照一對多的資料對映時,最終的結果數會小於等於查詢的總記錄數。
前端開發框架總結之利用Jtopo實現網路拓撲功能(四)
前端開發框架總結之利用Jtopo實現網路拓撲功能(四) 上文我們講了拓撲容器相關的互動設計和實現思路以及一些關鍵技術細節。至此,我們已經覆蓋了結
前端開發框架總結之利用Jtopo實現網路拓撲功能(三)
前端開發框架總結之利用Jtopo實現網路拓撲功能(三) 上文我們講了一些拓撲連線、拓撲文字節點相關的互動設計和實現思路以及一些關鍵技術細節。本文
前端開發框架總結之利用Jtopo實現網路拓撲功能(二)
前端開發框架總結之利用Jtopo實現網路拓撲功能(二) 上文我們講了一些拓撲結點生成的實際場景設計和實現思路以及一些關鍵技術細節。本文我們繼續我們的拓撲管理
前端開發框架總結之利用Jtopo實現網路拓撲功能(一)
前端開發框架總結之利用Jtopo實現網路拓撲功能(一) 前言: 前段時間由於專案需要實現一個網路裝置拓撲管理的
Mybatis中註解方式實現一對多查詢
上一篇關於mybatis的記錄瞭如何查詢user這個實體類的資料。假設這些使用者分屬於不同的工作部門,今天記錄實現查詢部門及下屬使用者的過程。據此,新建一個mysql的 table,名為department_,欄位為id,name。程式碼略。 在com.mybatis.po
mybatis xml中實現一對多查詢時, 子查詢帶多個引數
1、mapper檔案中: List<Object> getXXXXX(@Param("taskId")String taskId,@Param("taskType")String taskType); 2、xml檔案中 <select id="" resultMap
【Jsp】利用Application物件實現訪問人數統計功能
利用Application物件實現訪問人數的統計很常見,但是一些書籍講解這一技術的時候,往往沒有做完整。一旦伺服器重啟,由於Application會被銷燬,重新建立,人數統計則會再一次從零開始。解決方法,個人認為,應該同時利用到資料庫,這樣無論伺服器要重啟或者遭遇到停機什麼
delegate協議實現一對多
代理一般是一對一的, 如果要一對多, 那麼就是多播代理; 多播代理只是多了箇中間層,但最終遵守協議的只有一個, 那就是中間層, 所以不是 delegates, 依然是 delegate 假設我現在有三個 controller, 需要從一個 tableView(顏色資料
mybatis 使用collection標籤實現一對多查詢(多分頁使用)
在使用**ListPage分頁工具類進行分頁操作時,如果使用一對多查詢,會造成查詢出來每一頁資料數量不等於實際規定的每一個數據數量。原因在於,一對多查詢的結果是包含了與子錶鏈接的資料,例如在查詢10個訂單(order_header)資料時,假如有兩個訂單均包含2條訂單條目(
springboot +mybatis 實現一對多,多對一,多對多 【註解版】
MyBatis中的一對多 ,多對一,多對多【註解】 以下的例子就是針對 前端框架中所實現的 省-市-區 選擇框的資料介面 前端需要的介面型別: 後臺程式碼: dao層: ProvinceDAO /** * * @author 鄔志斌
Mybatis中collection實現一對多的問題
今天在使用Mybatis中的Collection獲取集合資訊時,資料庫中對應了多條資料,但在做單元測試時只能獲取到一條資料。 糾結了很久,突然想到是不是主鍵的問題,結果一試,還真是這麼回事。 Myba
利用反射機制實現servlet的分派功能
package com.iflytek.utils; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import jav