摘要:我們知道是一個隊列,生產(chǎn)者往隊列里發(fā)布一項事件或稱之為消息也可以時,消費者能獲得通知如果沒有事件時,消費者被堵塞,直到生產(chǎn)者發(fā)布了新的事件。實戰(zhàn)本文先不具體去闡述的工作具體原理,只是簡單地將與其整合。
什么是Disruptor
從功能上來看,Disruptor 是實現(xiàn)了“隊列”的功能,而且是一個有界隊列。那么它的應(yīng)用場景自然就是“生產(chǎn)者-消費者”模型的應(yīng)用場合了。
可以拿 JDK 的 BlockingQueue 做一個簡單對比,以便更好地認識 Disruptor 是什么。
我們知道 BlockingQueue 是一個 FIFO 隊列,生產(chǎn)者(Producer)往隊列里發(fā)布(publish)一項事件(或稱之為“消息”也可以)時,消費者(Consumer)能獲得通知;如果沒有事件時,消費者被堵塞,直到生產(chǎn)者發(fā)布了新的事件。
這些都是 Disruptor 能做到的,與之不同的是,Disruptor 能做更多:
同一個“事件”可以有多個消費者,消費者之間既可以并行處理,也可以相互依賴形成處理的先后次序(形成一個依賴圖);
預(yù)分配用于存儲事件內(nèi)容的內(nèi)存空間;
針對極高的性能目標(biāo)而實現(xiàn)的極度優(yōu)化和無鎖的設(shè)計;
以上雖然簡單地描述了 Disruptor 是什么,但對于它"能做什么",還不是那么明白。簡而言之,當(dāng)你需要在兩個獨立的處理過程之間交換數(shù)據(jù)時,就可以使用 Disruptor 。當(dāng)然使用隊列也可以,只不過 Disruptor 的性能更好。
實戰(zhàn)本文先不具體去闡述Disruptor的工作具體原理,只是簡單地將Spring與其整合。整合過程很簡單,具體步驟如下:
在pom文件中引入disruptor
com.lmax disruptor 3.4.2
創(chuàng)建事件
@Data public class NotifyEvent { private String message; }
創(chuàng)建消息工廠用于生產(chǎn)消息
public class NotifyEventFactory implements EventFactory { @Override public Object newInstance() { return new NotifyEvent(); } }
創(chuàng)建消費者,此處用于處理業(yè)務(wù)邏輯
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以下版本使用以上注釋的一段 } }
在需要調(diào)用的地方注入INotifyService并調(diào)用sendNotify方法
@GetMapping("test") @ResponseBody public String testLog() { log.info("============="); notifyService.sendNotify("Hello,World!"); return "hello,world"; }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/69122.html
摘要:作為微服務(wù)的基礎(chǔ)設(shè)施之一,背靠強大的生態(tài)社區(qū),支撐技術(shù)體系。微服務(wù)實踐為系列講座,專題直播節(jié),時長高達小時,包括目前最流行技術(shù),深入源碼分析,授人以漁的方式,幫助初學(xué)者深入淺出地掌握,為高階從業(yè)人員拋磚引玉。 簡介 目前業(yè)界最流行的微服務(wù)架構(gòu)正在或者已被各種規(guī)模的互聯(lián)網(wǎng)公司廣泛接受和認可,業(yè)已成為互聯(lián)網(wǎng)開發(fā)人員必備技術(shù)。無論是互聯(lián)網(wǎng)、云計算還是大數(shù)據(jù),Java平臺已成為全棧的生態(tài)體系,...
摘要:此時可以嘗試或命令打包,安裝包內(nèi)的文件中占位符已被替換。整合原理項目中一般都會加上可以查看的文件,里面包含定義的值是這樣插件會將或文件中的替換為中對應(yīng)的值。 在Maven和Spring中,都有profile這個概念。profile是用于區(qū)分各種環(huán)境的,例如開發(fā)環(huán)境、測試環(huán)境、正式環(huán)境等。Maven的profile用于在打包時根據(jù)指定環(huán)境替換不同環(huán)境的配置文件配置,如數(shù)據(jù)庫配置。Spri...
摘要:常用的配置屬性加載映射文件映射到文件夾加載映射文件映射到具體位置我們推薦的就是使用這一種,就可以少了的配置文件了。 前言 前面已經(jīng)學(xué)習(xí)了如何使用Spring與Struts2進行整合,本博文主要講解如何使用Spring對Hibernate進行整合 Spring和Hibernate整合的關(guān)鍵點: SessionFactory對象交給Spring來創(chuàng)建 Hibernate的事務(wù)交給Spri...
摘要:在之后,也終于發(fā)布了最新的版本。該版本距離上一次發(fā)布,過去了整整個月下面就隨我一起看看,這個大家期待已久的版本都有哪些內(nèi)容值得我們關(guān)注。如果是用戶,同時也是阿里云這些產(chǎn)品的用戶,那么直接使用還是非常方便的。 在Nacos 1.0.0 Release之后,Spring Cloud Alibaba也終于發(fā)布了最新的版本。該版本距離上一次發(fā)布,過去了整整4個月!下面就隨我一起看看,這個大家期...
閱讀 1261·2023-04-25 19:10
閱讀 1140·2021-09-10 10:50
閱讀 3028·2021-09-02 15:21
閱讀 1383·2019-08-30 15:52
閱讀 1681·2019-08-30 13:56
閱讀 2078·2019-08-30 12:53
閱讀 1870·2019-08-28 18:22
閱讀 2115·2019-08-26 13:47