亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

Spring整合Disruptor3

khs1994 / 2293人閱讀

摘要:我們知道是一個(gè)隊(duì)列,生產(chǎn)者往隊(duì)列里發(fā)布一項(xiàng)事件或稱(chēng)之為消息也可以時(shí),消費(fèi)者能獲得通知如果沒(méi)有事件時(shí),消費(fèi)者被堵塞,直到生產(chǎn)者發(fā)布了新的事件。實(shí)戰(zhàn)本文先不具體去闡述的工作具體原理,只是簡(jiǎn)單地將與其整合。

什么是Disruptor

從功能上來(lái)看,Disruptor 是實(shí)現(xiàn)了“隊(duì)列”的功能,而且是一個(gè)有界隊(duì)列。那么它的應(yīng)用場(chǎng)景自然就是“生產(chǎn)者-消費(fèi)者”模型的應(yīng)用場(chǎng)合了。
可以拿 JDK 的 BlockingQueue 做一個(gè)簡(jiǎn)單對(duì)比,以便更好地認(rèn)識(shí) Disruptor 是什么。
我們知道 BlockingQueue 是一個(gè) FIFO 隊(duì)列,生產(chǎn)者(Producer)往隊(duì)列里發(fā)布(publish)一項(xiàng)事件(或稱(chēng)之為“消息”也可以)時(shí),消費(fèi)者(Consumer)能獲得通知;如果沒(méi)有事件時(shí),消費(fèi)者被堵塞,直到生產(chǎn)者發(fā)布了新的事件。
這些都是 Disruptor 能做到的,與之不同的是,Disruptor 能做更多:

同一個(gè)“事件”可以有多個(gè)消費(fèi)者,消費(fèi)者之間既可以并行處理,也可以相互依賴(lài)形成處理的先后次序(形成一個(gè)依賴(lài)圖);

預(yù)分配用于存儲(chǔ)事件內(nèi)容的內(nèi)存空間;

針對(duì)極高的性能目標(biāo)而實(shí)現(xiàn)的極度優(yōu)化和無(wú)鎖的設(shè)計(jì);

以上雖然簡(jiǎn)單地描述了 Disruptor 是什么,但對(duì)于它"能做什么",還不是那么明白。簡(jiǎn)而言之,當(dāng)你需要在兩個(gè)獨(dú)立的處理過(guò)程之間交換數(shù)據(jù)時(shí),就可以使用 Disruptor 。當(dāng)然使用隊(duì)列也可以,只不過(guò) Disruptor 的性能更好。

實(shí)戰(zhàn)

本文先不具體去闡述Disruptor的工作具體原理,只是簡(jiǎn)單地將Spring與其整合。整合過(guò)程很簡(jiǎn)單,具體步驟如下:

在pom文件中引入disruptor


    com.lmax
    disruptor
    3.4.2

創(chuàng)建事件

@Data
public class NotifyEvent {
    private String message;
}

創(chuàng)建消息工廠(chǎng)用于生產(chǎn)消息

public class NotifyEventFactory implements EventFactory {
    @Override
    public Object newInstance() {
        return new NotifyEvent();
    }
}

創(chuàng)建消費(fèi)者,此處用于處理業(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,對(duì)Disruptor進(jìn)行初始化

@Service
public class NotifyServiceImpl implements INotifyService, DisposableBean,InitializingBean {
    private Disruptor disruptor;
    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式寫(xiě)法,如果是用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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/69122.html

相關(guān)文章

  • [直播視頻] 《Java 微服務(wù)實(shí)踐 - Spring Boot 系列》限時(shí)折扣

    摘要:作為微服務(wù)的基礎(chǔ)設(shè)施之一,背靠強(qiáng)大的生態(tài)社區(qū),支撐技術(shù)體系。微服務(wù)實(shí)踐為系列講座,專(zhuān)題直播節(jié),時(shí)長(zhǎng)高達(dá)小時(shí),包括目前最流行技術(shù),深入源碼分析,授人以漁的方式,幫助初學(xué)者深入淺出地掌握,為高階從業(yè)人員拋磚引玉。 簡(jiǎn)介 目前業(yè)界最流行的微服務(wù)架構(gòu)正在或者已被各種規(guī)模的互聯(lián)網(wǎng)公司廣泛接受和認(rèn)可,業(yè)已成為互聯(lián)網(wǎng)開(kāi)發(fā)人員必備技術(shù)。無(wú)論是互聯(lián)網(wǎng)、云計(jì)算還是大數(shù)據(jù),Java平臺(tái)已成為全棧的生態(tài)體系,...

    Enlightenment 評(píng)論0 收藏0
  • Maven profile整合Spring profile

    摘要:此時(shí)可以嘗試或命令打包,安裝包內(nèi)的文件中占位符已被替換。整合原理項(xiàng)目中一般都會(huì)加上可以查看的文件,里面包含定義的值是這樣插件會(huì)將或文件中的替換為中對(duì)應(yīng)的值。 在Maven和Spring中,都有profile這個(gè)概念。profile是用于區(qū)分各種環(huán)境的,例如開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、正式環(huán)境等。Maven的profile用于在打包時(shí)根據(jù)指定環(huán)境替換不同環(huán)境的配置文件配置,如數(shù)據(jù)庫(kù)配置。Spri...

    用戶(hù)84 評(píng)論0 收藏0
  • Hibernate【與Spring整合

    摘要:常用的配置屬性加載映射文件映射到文件夾加載映射文件映射到具體位置我們推薦的就是使用這一種,就可以少了的配置文件了。 前言 前面已經(jīng)學(xué)習(xí)了如何使用Spring與Struts2進(jìn)行整合,本博文主要講解如何使用Spring對(duì)Hibernate進(jìn)行整合 Spring和Hibernate整合的關(guān)鍵點(diǎn): SessionFactory對(duì)象交給Spring來(lái)創(chuàng)建 Hibernate的事務(wù)交給Spri...

    chadLi 評(píng)論0 收藏0
  • Spring Cloud Alibaba 新版本發(fā)布:眾多期待內(nèi)容整合打包加入!

    摘要:在之后,也終于發(fā)布了最新的版本。該版本距離上一次發(fā)布,過(guò)去了整整個(gè)月下面就隨我一起看看,這個(gè)大家期待已久的版本都有哪些內(nèi)容值得我們關(guān)注。如果是用戶(hù),同時(shí)也是阿里云這些產(chǎn)品的用戶(hù),那么直接使用還是非常方便的。 在Nacos 1.0.0 Release之后,Spring Cloud Alibaba也終于發(fā)布了最新的版本。該版本距離上一次發(fā)布,過(guò)去了整整4個(gè)月!下面就隨我一起看看,這個(gè)大家期...

    不知名網(wǎng)友 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<