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

spring scheduled單線程和多線程使用過程中的大坑

 更新時(shí)間:2022年01月28日 11:33:41   作者:程序員大佬  
本文主要介紹了spring scheduled單線程和多線程使用過程中的大坑,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

公司在使用定時(shí)任務(wù)的時(shí)候,使用的是spring scheduled。

代碼如下:

@EnableScheduling
public class TaskFileScheduleService {


? ? @Scheduled(cron="0 */1 * * * ?")
? ? public void task1(){
? ? .......
? ? }
? ??
? ? @Scheduled(cron="0 */1 * * * ?")
? ? public void task2(){
? ? .......
? ? }

某天,接到領(lǐng)導(dǎo)的電話,說生產(chǎn)環(huán)境的定時(shí)任務(wù)不跑了,趕緊給看看~
做為一名負(fù)責(zé)人的程序員,趕緊放下手中泡面,遠(yuǎn)程到公司的電腦~
線程卡死這種問題,第一步當(dāng)然是將jvm中的heap dump和thread dump導(dǎo)出來~
經(jīng)過簡單分析,thread dump中某個(gè)線程確實(shí)一直處理running狀態(tài),heap dump沒啥問題~
thread dump中的問題線程:

"pool-2-thread-43" #368 prio=5 os_prio=0 tid=0x00005587fd54c800 nid=0x1df runnable [0x00007ff7e2056000]
   java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:171)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.net.SocketInputStream.read(SocketInputStream.java:224)
    at ch.ethz.ssh2.transport.ClientServerHello.readLineRN(ClientServerHello.java:30)
    at ch.ethz.ssh2.transport.ClientServerHello.<init>(ClientServerHello.java:67)
    at ch.ethz.ssh2.transport.TransportManager.initialize(TransportManager.java:455)
    at ch.ethz.ssh2.Connection.connect(Connection.java:643)
    - locked <0x000000074539e0e8> (a ch.ethz.ssh2.Connection)
    at ch.ethz.ssh2.Connection.connect(Connection.java:490)
    - locked <0x000000074539e0e8> (a ch.ethz.ssh2.Connection)
    at com.suneee.yige.medicalserver.common.SSHUtils.connect(SSHUtils.java:24)
    at com.suneee.yige.medicalserver.service.TaskFileScheduleService.getConn(TaskFileScheduleService.java:102)
    at com.suneee.yige.medicalserver.service.TaskFileScheduleService.taskInfo(TaskFileScheduleService.java:108)
    at com.suneee.yige.medicalserver.service.TaskFileScheduleService.task(TaskFileScheduleService.java:74)
    at sun.reflect.GeneratedMethodAccessor295.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

很明顯,ch.ethz.ssh2.Connection.connect這個(gè)方法卡死,導(dǎo)致線程一直處于running狀態(tài)。

由于spring scheduled默認(rèn)是所有定時(shí)任務(wù)都在一個(gè)線程中執(zhí)行??!這是個(gè)大坑?。?!
也就是說定時(shí)任務(wù)1一直在執(zhí)行,定時(shí)任務(wù)2一直在等待定時(shí)任務(wù)1執(zhí)行完成。這就導(dǎo)致了生產(chǎn)上定時(shí)任務(wù)全部卡死的現(xiàn)象。

問題已經(jīng)很明確了,要么解決ch.ethz.ssh2.Connection.connect卡死的問題,要么解決spring scheduled單線程處理的問題。

首先,想到的是處理ch.ethz.ssh2.Connection.connect卡死的問題,但是經(jīng)過一番查找,發(fā)現(xiàn)這個(gè)ssh的工具包很久沒更更新過了,也沒有設(shè)置例如httpclient的超時(shí)時(shí)間之類的。這就很難辦了!果斷放棄!!

現(xiàn)在只剩一條路,怎么在任務(wù)1卡死的時(shí)候,任務(wù)2可以按他自己的周期執(zhí)行,且任務(wù)1也按照固定周期執(zhí)行,不會(huì)因?yàn)槟炒稳蝿?wù)1卡死導(dǎo)致后續(xù)的定時(shí)任務(wù)出現(xiàn)問題!

方法一:

添加配置

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
? ? @Override
? ? public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
? ? ? ? taskRegistrar.setScheduler(Executors.newScheduledThreadPool(50));
? ? }
}

這個(gè)方法,在程序啟動(dòng)后,會(huì)逐步啟動(dòng)50個(gè)線程,放在線程池中。每個(gè)定時(shí)任務(wù)會(huì)占用1個(gè)線程。但是相同的定時(shí)任務(wù),執(zhí)行的時(shí)候,還是在同一個(gè)線程中。
例如,程序啟動(dòng),每個(gè)定時(shí)任務(wù)占用一個(gè)線程。任務(wù)1開始執(zhí)行,任務(wù)2也開始執(zhí)行。如果任務(wù)1卡死了,那么下個(gè)周期,任務(wù)1還是處理卡死狀態(tài),任務(wù)2可以正常執(zhí)行。也就是說,任務(wù)1某一次卡死了,不會(huì)影響其他線程,但是他自己本身這個(gè)定時(shí)任務(wù)會(huì)一直等待上一次任務(wù)執(zhí)行完成!
這種顯然不行!這也是踩過坑才知道的?。?!

方法二(正解):

添加配置:

@Configuration
@EnableAsync
public class ScheduleConfig {

? ? @Bean
? ? public TaskScheduler taskScheduler() {
? ? ? ? ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
? ? ? ? taskScheduler.setPoolSize(50);
? ? ? ? return taskScheduler;
? ? }
}

在方法上添加注解@Async

@EnableScheduling
public class TaskFileScheduleService {


? ? @Async
? ? @Scheduled(cron="0 */1 * * * ?")
? ? public void task1(){
? ? .......
? ? }
? ??
? ? @Async
? ? @Scheduled(cron="0 */1 * * * ?")
? ? public void task2(){
? ? .......
? ? }

這種方法,每次定時(shí)任務(wù)啟動(dòng)的時(shí)候,都會(huì)創(chuàng)建一個(gè)單獨(dú)的線程來處理。也就是說同一個(gè)定時(shí)任務(wù)也會(huì)啟動(dòng)多個(gè)線程處理。
例如:任務(wù)1和任務(wù)2一起處理,但是線程1卡死了,任務(wù)2是可以正常執(zhí)行的。且下個(gè)周期,任務(wù)1還是會(huì)正常執(zhí)行,不會(huì)因?yàn)樯弦淮慰ㄋ懒?,影響任?wù)1。
但是任務(wù)1中的卡死線程越來越多,會(huì)導(dǎo)致50個(gè)線程池占滿,還是會(huì)影響到定時(shí)任務(wù)。
這時(shí)候,可能會(huì)幾個(gè)月發(fā)生一次~到時(shí)候再重啟就行了!

到此這篇關(guān)于spring scheduled單線程和多線程使用過程中的大坑的文章就介紹到這了,更多相關(guān)spring scheduled單線程和多線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC ViewResolver視圖解析器組件

    SpringMVC ViewResolver視圖解析器組件

    這篇文章主要介紹了SpringMVC ViewResolver視圖解析器組件,Spring MVC的視圖解析器 ViewResolver 是框架中一個(gè)重要的組件,用于將控制器返回的邏輯視圖名稱解析為具體的視圖實(shí)現(xiàn)對象,最終呈現(xiàn)給用戶的是具體的視圖實(shí)現(xiàn)
    2023-04-04
  • Java中的HashMap集合深度解析

    Java中的HashMap集合深度解析

    這篇文章主要介紹了Java中的HashMap集合深度解析, HashMap可以說是Java中最常用的集合類框架之一,是Java語言中非常典型的數(shù)據(jù)結(jié)構(gòu),我們總會(huì)在不經(jīng)意間用到它,很大程度上方便了我們?nèi)粘i_發(fā),需要的朋友可以參考下
    2023-09-09
  • SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的4種方式詳解

    SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的4種方式詳解

    這篇文章主要介紹了SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的4種方式詳解,在Springboot中定時(shí)任務(wù)是一項(xiàng)經(jīng)常能用到的功能,實(shí)現(xiàn)定時(shí)任務(wù)的方式有很多,今天來介紹常用的幾種,需要的朋友可以參考下
    2023-11-11
  • 解決SSLContext.getInstance()中參數(shù)設(shè)置TLS版本無效的問題

    解決SSLContext.getInstance()中參數(shù)設(shè)置TLS版本無效的問題

    這篇文章主要介紹了解決SSLContext.getInstance()中參數(shù)設(shè)置TLS版本無效的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java實(shí)現(xiàn)字符串切割的方法詳解

    Java實(shí)現(xiàn)字符串切割的方法詳解

    這篇文章主要為大家介紹了一些Java中切割字符串的小技巧,可以把性能提升5~10倍。文中的示例代碼講解詳細(xì),快跟隨小編一起學(xué)習(xí)一下
    2022-03-03
  • SpringCloud集成Hystrix熔斷過程分步分解

    SpringCloud集成Hystrix熔斷過程分步分解

    通過hystrix可以解決雪崩效應(yīng)問題,它提供了資源隔離、降級機(jī)制、融斷、緩存等功能。接下來通過本文給大家分享SpringCloud集成Hystrix熔斷,感興趣的朋友一起看看吧
    2022-09-09
  • Springboot實(shí)現(xiàn)對配置文件中的明文密碼加密詳解

    Springboot實(shí)現(xiàn)對配置文件中的明文密碼加密詳解

    我們在SpringBoot項(xiàng)目當(dāng)中,會(huì)把數(shù)據(jù)庫的用戶名密碼等配置直接放在yaml或者properties文件中,這樣維護(hù)數(shù)據(jù)庫的密碼等敏感信息顯然是有一定風(fēng)險(xiǎn)的。所以本文為大家整理了對配置文件中的明文密碼加密的方法,希望對大家有所幫助
    2023-03-03
  • 如何開發(fā)一個(gè)簡單的Akka Java應(yīng)用

    如何開發(fā)一個(gè)簡單的Akka Java應(yīng)用

    這篇文章主要介紹了如何開發(fā)一個(gè)簡單的Akka Java應(yīng)用 ,幫助大家使用Java創(chuàng)建Akka項(xiàng)目并將其打包,感興趣的朋友可以了解下
    2020-10-10
  • 模擬Spring的簡單實(shí)現(xiàn)

    模擬Spring的簡單實(shí)現(xiàn)

    本文的主要內(nèi)容就是學(xué)習(xí)Spring的開端,模擬一下Spring的實(shí)現(xiàn),感興趣的小伙伴可以參考一下
    2015-10-10
  • Java 詳解包裝類Integer與int有哪些共通和不同

    Java 詳解包裝類Integer與int有哪些共通和不同

    這篇文章主要介紹的是 Java中int和Integer的區(qū)別,Java 是一種強(qiáng)數(shù)據(jù)類型的語言,因此所有的屬性必須有一個(gè)數(shù)據(jù)類型,下面文章基于Java詳細(xì)int和Integer有何區(qū)別,需要的朋友可以參考一下
    2022-04-04

最新評論

柞水县| 本溪市| 资溪县| 特克斯县| 嵊州市| 丹江口市| 仁怀市| 灵川县| 班戈县| 吉首市| 清丰县| 拜泉县| 托克逊县| 福泉市| 桂阳县| 郸城县| 肥乡县| 壤塘县| 莆田市| 革吉县| 西平县| 拜城县| 峡江县| 英吉沙县| 永新县| 凤冈县| 涞源县| 中方县| 黄大仙区| 永顺县| 鄯善县| 双牌县| 辛集市| 儋州市| 磐安县| 东兴市| 疏附县| 溧水县| 桑植县| 镇原县| 专栏|