摘要:我們知道是一個隊列,生產者往隊列里發布一項事件或稱之為消息也可以時,消費者能獲得通知如果沒有事件時,消費者被堵塞,直到生產者發布了新的事件。實戰本文先不具體去闡述的工作具體原理,只是簡單地將與其整合。
什么是Disruptor
從功能上來看,Disruptor 是實現了“隊列”的功能,而且是一個有界隊列。那么它的應用場景自然就是“生產者-消費者”模型的應用場合了。
可以拿 JDK 的 BlockingQueue 做一個簡單對比,以便更好地認識 Disruptor 是什么。
我們知道 BlockingQueue 是一個 FIFO 隊列,生產者(Producer)往隊列里發布(publish)一項事件(或稱之為“消息”也可以)時,消費者(Consumer)能獲得通知;如果沒有事件時,消費者被堵塞,直到生產者發布了新的事件。
這些都是 Disruptor 能做到的,與之不同的是,Disruptor 能做更多:
同一個“事件”可以有多個消費者,消費者之間既可以并行處理,也可以相互依賴形成處理的先后次序(形成一個依賴圖);
預分配用于存儲事件內容的內存空間;
針對極高的性能目標而實現的極度優化和無鎖的設計;
以上雖然簡單地描述了 Disruptor 是什么,但對于它"能做什么",還不是那么明白。簡而言之,當你需要在兩個獨立的處理過程之間交換數據時,就可以使用 Disruptor 。當然使用隊列也可以,只不過 Disruptor 的性能更好。
實戰本文先不具體去闡述Disruptor的工作具體原理,只是簡單地將Spring與其整合。整合過程很簡單,具體步驟如下:
在pom文件中引入disruptor
com.lmax disruptor 3.4.2
創建事件
@Data public class NotifyEvent { private String message; }
創建消息工廠用于生產消息
public class NotifyEventFactory implements EventFactory { @Override public Object newInstance() { return new NotifyEvent(); } }
創建消費者,此處用于處理業務邏輯
public class NotifyEventHandler implements EventHandler,WorkHandler { @Override public void onEvent(NotifyEvent notifyEvent, long l, boolean b) throws Exception { System.out.println("接收到消息"); this.onEvent(notifyEvent); } @Override public void onEvent(NotifyEvent notifyEvent) throws Exception { System.out.println(notifyEvent+">>>"+UUID.randomUUID().toString()); } }
自定義異常
@Log4j2 public class NotifyEventHandlerException implements ExceptionHandler { @Override public void handleEventException(Throwable throwable, long sequence, Object event) { throwable.fillInStackTrace(); log.error("process data error sequence ==[{}] event==[{}] ,ex ==[{}]", sequence, event.toString(), throwable.getMessage()); } @Override public void handleOnStartException(Throwable throwable) { log.error("start disruptor error ==[{}]!", throwable.getMessage()); } @Override public void handleOnShutdownException(Throwable throwable) { log.error("shutdown disruptor error ==[{}]!", throwable.getMessage()); } }
整合Spring,對Disruptor進行初始化
@Service public class NotifyServiceImpl implements INotifyService, DisposableBean,InitializingBean { private Disruptordisruptor; private static final int RING_BUFFER_SIZE = 1024 * 1024; @Override public void destroy() throws Exception { disruptor.shutdown(); } @Override public void afterPropertiesSet() throws Exception { disruptor = new Disruptor (new NotifyEventFactory(),RING_BUFFER_SIZE, Executors.defaultThreadFactory(), ProducerType.SINGLE,new BlockingWaitStrategy()); disruptor.setDefaultExceptionHandler(new NotifyEventHandlerException()); disruptor.handleEventsWith(new NotifyEventHandler()); disruptor.start(); } @Override public void sendNotify(String message) { RingBuffer ringBuffer = disruptor.getRingBuffer(); // ringBuffer.publishEvent(new EventTranslatorOneArg () { // @Override // public void translateTo(NotifyEvent event, long sequence, String data) { // event.setMessage(data); // } // }, message); ringBuffer.publishEvent((event, sequence, data) -> event.setMessage(data), message); //lambda式寫法,如果是用jdk1.8以下版本使用以上注釋的一段 } }
在需要調用的地方注入INotifyService并調用sendNotify方法
@GetMapping("test") @ResponseBody public String testLog() { log.info("============="); notifyService.sendNotify("Hello,World!"); return "hello,world"; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/69122.html
摘要:作為微服務的基礎設施之一,背靠強大的生態社區,支撐技術體系。微服務實踐為系列講座,專題直播節,時長高達小時,包括目前最流行技術,深入源碼分析,授人以漁的方式,幫助初學者深入淺出地掌握,為高階從業人員拋磚引玉。 簡介 目前業界最流行的微服務架構正在或者已被各種規模的互聯網公司廣泛接受和認可,業已成為互聯網開發人員必備技術。無論是互聯網、云計算還是大數據,Java平臺已成為全棧的生態體系,...
摘要:此時可以嘗試或命令打包,安裝包內的文件中占位符已被替換。整合原理項目中一般都會加上可以查看的文件,里面包含定義的值是這樣插件會將或文件中的替換為中對應的值。 在Maven和Spring中,都有profile這個概念。profile是用于區分各種環境的,例如開發環境、測試環境、正式環境等。Maven的profile用于在打包時根據指定環境替換不同環境的配置文件配置,如數據庫配置。Spri...
摘要:常用的配置屬性加載映射文件映射到文件夾加載映射文件映射到具體位置我們推薦的就是使用這一種,就可以少了的配置文件了。 前言 前面已經學習了如何使用Spring與Struts2進行整合,本博文主要講解如何使用Spring對Hibernate進行整合 Spring和Hibernate整合的關鍵點: SessionFactory對象交給Spring來創建 Hibernate的事務交給Spri...
摘要:在之后,也終于發布了最新的版本。該版本距離上一次發布,過去了整整個月下面就隨我一起看看,這個大家期待已久的版本都有哪些內容值得我們關注。如果是用戶,同時也是阿里云這些產品的用戶,那么直接使用還是非常方便的。 在Nacos 1.0.0 Release之后,Spring Cloud Alibaba也終于發布了最新的版本。該版本距離上一次發布,過去了整整4個月!下面就隨我一起看看,這個大家期...
閱讀 1282·2023-04-25 19:10
閱讀 1156·2021-09-10 10:50
閱讀 3040·2021-09-02 15:21
閱讀 1398·2019-08-30 15:52
閱讀 1694·2019-08-30 13:56
閱讀 2097·2019-08-30 12:53
閱讀 1884·2019-08-28 18:22
閱讀 2135·2019-08-26 13:47