欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring的事件和監(jiān)聽器-同步與異步詳解

 更新時間:2021年12月28日 10:25:11   作者:^破曉^  
這篇文章主要介紹了Spring的事件和監(jiān)聽器-同步與異步詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Spring的事件和監(jiān)聽器-同步與異步

Application下抽象子類ApplicationContextEvent的下面有4個已經(jīng)實現(xiàn)好的事件

  • ContextClosedEvent(容器關(guān)閉時)
  • ContextRefreshedEvent(容器刷新是)
  • ContextStartedEvent(容器啟動時候)
  • ContextStoppedEvent(容器停止的時候)

同樣,這四個事件都繼承了ApplicationEvent,如果我們想自定義事件,也可以通過繼承ApplicationEvent來實現(xiàn)

1、首先新建StartWorkflowEvent.java,

繼承ApplicationEvent抽象類

public class StartWorkflowEvent extends ApplicationEvent {
    //存放構(gòu)造器送入的值
    private String msg;
    //構(gòu)造器參數(shù)可以隨意設置,這里為了方便調(diào)試,設置為字符串
    public StartWorkflowEvent (String msg) {
        super(msg);
        this.msg=msg;
    }
    //自定義一個方法,這個方法也可以隨意寫,這里也是測試用
    public void myevent(){
        System.out.println("********My event**************");
        System.out.println(msg);
        System.out.println("*******************************");
    }
}

2、新建一個監(jiān)聽器StartWorkflowListener.java

實現(xiàn)ApplicationListener<StartWorkflowEvent>

/**
 * 發(fā)起流程事件監(jiān)聽
 */
@Component("startWorkflowListener")
public class StartWorkflowListener implements ApplicationListener<StartWorkflowEvent> {
 
    @Autowired
    private OaWorkflowHepler oaWorkflowHepler;
 
//@Async注解異步調(diào)用時使用, 異步調(diào)用時, 需要在xml配置文件中添加 <task:annotation-driven />
//  @Async
    @Override
    public void onApplicationEvent(StartWorkflowEvent event) {
        oaWorkflowHepler.start(event.getMsg());
    }
}

3、創(chuàng)建一個事件發(fā)布類EventPublisher.java

/**
 * 發(fā)布事件
 */
@Component("eventPublisher")
public class EventPublisher {
 
    @Autowired
    private ApplicationContext applicationContext;
 
    /**
     * 發(fā)布事件
     * @param event
     */
    public void publishEvent(ApplicationEvent event) {
        applicationContext.publishEvent(event);
    }
}

4、相關(guān)的配置

<task:annotation-driven />配置:

  • executor:指定一個缺省的executor給@Async使用。

例子:

<task:annotation-driven executor="asyncExecutor" />

<task:executor />配置參數(shù):

  • id:當配置多個executor時,被@Async("id")指定使用;也被作為線程名的前綴。
  • core size:最小的線程數(shù),缺?。?
  • max size:最大的線程數(shù),缺?。篒nteger.MAX_VALUE
  • queue-capacity:當最小的線程數(shù)已經(jīng)被占用滿后,新的任務會被放進queue里面,當這個 queue的capacity也被占滿之后,pool里面會創(chuàng)建新線程處理這個任務,直到總線程數(shù)達到了max size,這時系統(tǒng)會拒絕這個任務并拋出TaskRejectedException異常(缺省配置的情況下,可以通過rejection-policy 來決定如何處理這種情況)。缺省值為:Integer.MAX_VALUE
  • keep-alive:超過core size的那些線程,任務完成后,再經(jīng)過這個時長(秒)會被結(jié)束掉
  • rejection-policy:當pool已經(jīng)達到max size的時候,如何處理新任務
  • ABORT(缺?。簰伋鯰askRejectedException異常,然后不執(zhí)行
  • DISCARD:不執(zhí)行,也不拋出異常
  • DISCARD_OLDEST:丟棄queue中最舊的那個任務
  • CALLER_RUNS:不在新線程中執(zhí)行任務,而是有調(diào)用者所在的線程來執(zhí)行

Spring事件、異步監(jiān)聽

使用事件的模式可以對系統(tǒng)進行解耦,事件源發(fā)布一個事件,

事件監(jiān)聽器可以消費這個事件,而事件源不用關(guān)注發(fā)布的事件有哪些監(jiān)聽器,

這可以對系統(tǒng)進行解耦

在這里插入圖片描述

public class Mains extends ApplicationEvent {
    public Mains(Object name) {
        super(name);
        System.out.println(String.format("Hi,我是被監(jiān)聽的%s!",name));
    }
}
@Component
public class ListenerMains {
    //@Async  // 開啟異步就無法使用@Order(0)進行排序了
    @Order(0)
    @EventListener(Mains.class)
    public void listener(Mains mains){
        System.out.println("這是第一個監(jiān)聽類 "+mains.getSource());
    }
    //@Async
    @Order(1)
    @EventListener(Mains.class)
    public void listener2(Mains mains){
        System.out.println("這是第二個監(jiān)聽類 "+mains.getSource());
    }
    //@Async
    @Order(2)
    @EventListener(Mains.class)
    public void listener3(Mains mains){
        System.out.println("這是第三個監(jiān)聽類 "+mains.getSource());
    }
}
public class TestController {
    @Autowired
    GetAccessToken getAccessToken;
    @Autowired
    ApplicationEventPublisher publisher;
    @RequestMapping("test")
    public Object get() {
        publisher.publishEvent(new Mains("哈哈哈哈"));
    }
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java8新特性-Stream入門學習心得

    java8新特性-Stream入門學習心得

    這篇文章主要介紹了java8新特性-Stream入門學習心得,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 打印Java程序的線程棧信息方式

    打印Java程序的線程棧信息方式

    這篇文章主要介紹了打印Java程序的線程棧信息方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • mybatis mapper.xml獲取insert后的自增ID問題

    mybatis mapper.xml獲取insert后的自增ID問題

    這篇文章主要介紹了mybatis mapper.xml獲取insert后的自增ID問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java語言中cas指令的無鎖編程實現(xiàn)實例

    Java語言中cas指令的無鎖編程實現(xiàn)實例

    這篇文章主要介紹了Java語言中cas指令的無鎖編程實現(xiàn)實例,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • SpringMVC文件上傳 多文件上傳實例

    SpringMVC文件上傳 多文件上傳實例

    這篇文章主要介紹了SpringMVC文件上傳 多文件上傳實例,有需要的朋友可以參考一下
    2014-01-01
  • MAC下如何設置JDK環(huán)境變量

    MAC下如何設置JDK環(huán)境變量

    這篇文章主要介紹了MAC下如何設置JDK環(huán)境變量問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Spring Boot XSS 攻擊過濾插件使用

    Spring Boot XSS 攻擊過濾插件使用

    這篇文章主要介紹了Spring Boot XSS 攻擊過濾插件使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • SpringBoot整合log4j2日志的實現(xiàn)

    SpringBoot整合log4j2日志的實現(xiàn)

    在項目推進中,如果說第一件事是搭Spring框架的話,那么第二件事情就是在Sring基礎上搭建日志框架,大家都知道日志對于一個項目的重要性,尤其是線上Web項目,因為日志可能是我們了解應用如何執(zhí)行的唯一方式。此篇文章是博主在實踐中用Springboot整合log4j2日志的總結(jié)
    2021-06-06
  • 詳解Java如何實現(xiàn)數(shù)值校驗的算法

    詳解Java如何實現(xiàn)數(shù)值校驗的算法

    給定一個字符串如何判斷它是否為數(shù)值類型?本文將帶著大家學習一下如何利用Java實現(xiàn)這個判斷算法,感興趣的小伙伴可以學習一下
    2022-04-04
  • 解決spring-data-jpa 事物中修改屬性自動更新update問題

    解決spring-data-jpa 事物中修改屬性自動更新update問題

    這篇文章主要介紹了解決spring-data-jpa 事物中修改屬性自動更新update問題,具有很好的參考價值,希望對大家
    2021-08-08

最新評論