最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring定時任務(wù)無故停止又不報(bào)錯的解決

 更新時間:2021年11月02日 09:31:43   作者:思靈月  
這篇文章主要介紹了Spring定時任務(wù)無故停止又不報(bào)錯的解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Spring定時任務(wù)無故停止又不報(bào)錯

一開始是使用Spring自帶的定時器來配置定時任務(wù)的,簡單快捷,配置如下:

<bean id="refreshCache" class="com.gionee.baserom.search.job.RefreshCache" />
<task:scheduled-tasks>
    <task:scheduled ref="refreshCache" method="execute" cron="0 */30 * * * ?"/>
</task:scheduled-tasks>

但是使用一段時間之后就無故停止,且不報(bào)錯,所以沒有相關(guān)錯誤日志,需要重啟Tomcat之后才能繼續(xù)執(zhí)行定時任務(wù)。

開始以為由于數(shù)據(jù)庫最大連接數(shù)的限制,設(shè)置成翻倍了之后仍出現(xiàn)這問題。在同學(xué)的提醒下意識到可能是線程阻塞導(dǎo)致,于是網(wǎng)上查到原因:

Spring定時任務(wù)默認(rèn)都是并發(fā)執(zhí)行的,不會等待上一次任務(wù)執(zhí)行完畢,只要間隔時間到就會執(zhí)行。

解決方案

1.將JobDetail的concurrent屬性配置為false。不允許任務(wù)并發(fā)執(zhí)行。

2.任務(wù)執(zhí)行時間較長時,查找根本問題。

于是把Spring自帶的定時器改用Quartz,依賴相關(guān)包:

<dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.1</version>
</dependency>

定時任務(wù)配置如下:

<!-- 工作的bean -->
    <bean id="myJob" class=" com.gionee.baserom.exchangerate.job.DailyTaskJob" />
    <!-- 定義任務(wù),為了避免線程阻塞,用concurrent=false -->
    <bean id="myJobDetail"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="myJob" />
        <property name="targetMethod" value="execute" />
        <property name="concurrent" value="false" />
    </bean>
    <!-- 配置觸發(fā)器  -->
    <bean id="myJobTrigger"
        class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="myJobDetail" />
        <property name="cronExpression" value="0 0/30 * * * ?" />
    </bean>
    <!-- 配置調(diào)度器 -->
    <bean name="startQuertz" lazy-init="false" autowire="no" destroy-method="destroy" 
        class="com.gionee.baserom.exchangerate.util.SchedulerFactoryBeanWithShutdownDelay" >
        <property name="quartzProperties">
            <props>
                <prop key="org.quartz.threadPool.threadCount">1</prop>
            </props>
        </property>
        <property name="waitForJobsToCompleteOnShutdown">
            <value>false</value>
        </property>
        <property name="triggers">
            <list>
                <ref bean="myJobTrigger" />
            </list>
        </property>
    </bean>

在startQuartz中用到SchedulerFactoryBeanWithShutdownDelay是因?yàn)楫?dāng)Tomcat被關(guān)閉時,有可能導(dǎo)致任務(wù)線程并未完全關(guān)閉,導(dǎo)致內(nèi)存泄漏。

SchedulerFactoryBeanWithShutdownDelay.java

import org.quartz.SchedulerException;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
public class SchedulerFactoryBeanWithShutdownDelay extends SchedulerFactoryBean {
    @Override  
    public void destroy() throws SchedulerException {  
        super.destroy();  
        try {  
            Thread.sleep(1000);  
        } catch (InterruptedException e) {  
            throw new RuntimeException(e);  
        }  
    }  
}

Spring定時任務(wù)跑完不再啟動

spring的定時任務(wù)有以下兩個特性

1、單定時任務(wù)之間是串行,之前的任務(wù)沒執(zhí)行完,下一個任務(wù)不會啟動。

2、多個任務(wù)之間會相互干擾,其他同一時刻啟動的任務(wù)沒執(zhí)行完,下一個任務(wù)不會啟動。

排查方式

1、首先檢查自己的代碼,是否有死鎖、卡住、bug、http請求沒有設(shè)置超時時間等問題。

2、檢查是否所有定時任務(wù)都不啟動,如果是基本判斷是特性2導(dǎo)致的,檢查是哪個定時任務(wù)執(zhí)行慢、卡住、出現(xiàn)bug等情況。

解決思路

1、修復(fù)bug,如果有的話。

2、如果就是有個任務(wù)執(zhí)行慢,無法優(yōu)化,可以不用spring的定時任務(wù),改用Quartz。

依賴包

<dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.1</version>
</dependency>

配置:

<!-- 工作的bean -->
    <bean id="myJob" class=" com.gionee.baserom.exchangerate.job.DailyTaskJob" />
 
    <!-- 定義任務(wù),為了避免線程阻塞,用concurrent=false -->
    <bean id="myJobDetail"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="myJob" />
        <property name="targetMethod" value="execute" />
        <property name="concurrent" value="false" />
    </bean>
 
    <!-- 配置觸發(fā)器  -->
    <bean id="myJobTrigger"
        class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="myJobDetail" />
        <property name="cronExpression" value="0 0/30 * * * ?" />
    </bean>
 
    <!-- 配置調(diào)度器 -->
    <bean name="startQuertz" lazy-init="false" autowire="no" destroy-method="destroy" 
        class="com.gionee.baserom.exchangerate.util.SchedulerFactoryBeanWithShutdownDelay" >
        <property name="quartzProperties">
            <props>
                <prop key="org.quartz.threadPool.threadCount">1</prop>
            </props>
        </property>
        <property name="waitForJobsToCompleteOnShutdown">
            <value>false</value>
        </property>
        <property name="triggers">
            <list>
                <ref bean="myJobTrigger" />
            </list>
        </property>
    </bean>

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

相關(guān)文章

  • Java中的LinkedHashMap源碼分析

    Java中的LinkedHashMap源碼分析

    這篇文章主要介紹了Java中的LinkedHashMap源碼分析,LinkedHashMap是HashMap的子類,所以基本的操作與hashmap類似,不過呢,在插入、刪除、替換key-value對的時候,需要的朋友可以參考下
    2023-12-12
  • SpringBoot實(shí)現(xiàn)文件壓縮處理詳解

    SpringBoot實(shí)現(xiàn)文件壓縮處理詳解

    在工作我們經(jīng)常會出現(xiàn)有多個文件,為了節(jié)省資源會將多個文件放在一起進(jìn)行壓縮處理,本文將使用SpringBoot實(shí)現(xiàn)文件壓縮處理,感興趣的可以了解下
    2024-11-11
  • Java獲取用戶訪問IP及地理位置的方法詳解

    Java獲取用戶訪問IP及地理位置的方法詳解

    這篇文章主要介紹了Java獲取用戶訪問IP及地理位置的方法,結(jié)合實(shí)例形式詳細(xì)分析了Java基于百度地圖開放平臺獲取用戶訪問IP及地理位置相關(guān)操作技巧,需要的朋友可以參考下
    2020-04-04
  • Java中的Optional類詳細(xì)解讀

    Java中的Optional類詳細(xì)解讀

    這篇文章主要介紹了Java中的Optional類詳細(xì)解讀,Optional是Java中的一個類,它的作用是用于解決空指針異常的問題,它提供了一些有用的方法,可以幫助我們避免顯式進(jìn)行空值檢測,需要的朋友可以參考下
    2023-08-08
  • Java線程池配置的一些常見誤區(qū)總結(jié)

    Java線程池配置的一些常見誤區(qū)總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java線程池配置的一些常見誤區(qū),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • java 創(chuàng)建線程的四種方式

    java 創(chuàng)建線程的四種方式

    這篇文章主要介紹了java 創(chuàng)建線程的四種方式,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • 用Java生成二維碼并附帶文字信息

    用Java生成二維碼并附帶文字信息

    這篇文章主要介紹了用Java生成二維碼并附帶文字信息,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 如何在Maven項(xiàng)目中運(yùn)行JUnit5測試用例實(shí)現(xiàn)

    如何在Maven項(xiàng)目中運(yùn)行JUnit5測試用例實(shí)現(xiàn)

    這篇文章主要介紹了如何在Maven項(xiàng)目中運(yùn)行JUnit5測試用例實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Kotlin 和 Java 混合開發(fā)入門教程

    Kotlin 和 Java 混合開發(fā)入門教程

    這篇文章主要介紹了入門 Kotlin 和 Java 混合開發(fā),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Java中ArrayIndexOutOfBoundsException 異常報(bào)錯的解決方案

    Java中ArrayIndexOutOfBoundsException 異常報(bào)錯的解決方案

    本文主要介紹了Java中ArrayIndexOutOfBoundsException 異常報(bào)錯的解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評論

焦作市| 祁门县| 宁化县| 镇雄县| 花垣县| 宁都县| 玉林市| 田林县| 贵南县| 兴山县| 和田市| 广水市| 镇康县| 河津市| 拜泉县| 正阳县| 海安县| 克什克腾旗| 宁阳县| 老河口市| 岗巴县| 唐山市| 牙克石市| 中牟县| 黄平县| 赣州市| 大田县| 小金县| 客服| 沧源| 胶州市| 乐清市| 周宁县| 辛集市| 安龙县| 阿克陶县| 南澳县| 水城县| 页游| 杭锦旗| 永城市|