溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Spring Batch框架job任務(wù)為什么只跑一次

發(fā)布時間:2021-09-07 17:08:23 來源:億速云 閱讀:211 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“Spring Batch框架job任務(wù)為什么只跑一次”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“Spring Batch框架job任務(wù)為什么只跑一次”吧!

目錄
  • Spring Batch job任務(wù)只跑一次

    • 出現(xiàn)原因

    • 解決方法

  • job的啟動,停止,放棄

    • 1、啟動一個job

    • 2、停止一個job

    • 3、放棄一個job

    • 4、失敗一個job

    • 5、結(jié)束一個job

Spring Batch job任務(wù)只跑一次

在一次實際使用spring batch的過程中,在定時任務(wù)中,第一次執(zhí)行Job沒有出現(xiàn)問題,然后再次執(zhí)行時不會執(zhí)行job任務(wù);

出現(xiàn)原因

針對這種異常需要明確Job Instance的概念,Job Instance 是由Job的名稱和執(zhí)行該job的參數(shù)組成的,當(dāng)執(zhí)行Job時,會由于參數(shù)相同,會認為是同一個Job實例,如果該Job已經(jīng)執(zhí)行過,就會報出異常。判斷Job是否執(zhí)行過的狀態(tài)是保存到Job Repository中的。

解決方法

為了使執(zhí)行參數(shù)不同,可以在參數(shù)中添加一個時間戳

 JobParametersBuilder builder = new JobParametersBuilder();      
                       builder.addDate("date", new Date());

job的啟動,停止,放棄

1、啟動一個job

運行一個批處理任務(wù)至少有兩點要求:一個 JobLauncher 和一個用來運行的 job 。它們都包含了相同或是不同的 context 。舉例來說,從命令行來啟動job,會為每一個job初始化一個JVM,因此每個job會有一個自己的 JobLauncher;從web容器的HttpRequest來啟動job,一般只是用一個 JobLauncher 來異步啟動job,http請求會調(diào)用這個 JobLauncher 來啟動它們需要的job。

通過web啟動job的例子:

@Controller
public class JobLauncherController {
    @Autowired
    JobLauncher jobLauncher;
    @Autowired
    Job job;
    @RequestMapping("/jobLauncher.html")
    public void handle() throws Exception{
      jobLauncher.run(job, new JobParameters());
    }
}

2、停止一個job

關(guān)閉不是立即發(fā)生的,因為沒有辦法將一個任務(wù)立刻強制停掉,尤其是當(dāng)任務(wù)進行到開發(fā)人員自己的代碼段時,框架在此刻是無能為力的,比如某個業(yè)務(wù)邏輯處理。而一旦控制權(quán)還給了框架,它會立刻設(shè)置當(dāng)前 StepExecution 為 BachStatus.STOPPED ,意為停止,然后保存,最后在完成前對JobExecution進行相同的操作。

Set<Long> executions = jobOperator.getRunningExecutions("sampleJob");
jobOperator.stop(executions.iterator().next());

或者在配置文件中實現(xiàn):

它能夠讓job進行短暫的停留,以便操作員有時間進行其他的操作,stop元素必須配置restart屬性,當(dāng)該job重新啟動的時候,需要手動觸發(fā),執(zhí)行step2。

<step id="step1" parent="s1">
    <stop on="COMPLETED" restart="step2"/>
</step>
<step id="step2" parent="s2"/>

3、放棄一個job

一個job的執(zhí)行過程當(dāng)執(zhí)行到FAILED狀態(tài)之后,如果它是可重啟的,它將會被重啟。如果任務(wù)的執(zhí)行過程狀態(tài)是ABANDONED,那么框架就不會重啟它。ABANDONED狀態(tài)也適用于執(zhí)行步驟,使得它們可以被跳過,即便是在一個可重啟的任務(wù)執(zhí)行之中:如果任務(wù)執(zhí)行過程中碰到在上一次執(zhí)行失敗后標(biāo)記為ABANDONED的步驟,將會跳過該步驟直接到下一步(這是由任務(wù)流定義和執(zhí)行步驟的退出碼決定的)。

如果當(dāng)前的系統(tǒng)進程死掉了(“kill -9”或系統(tǒng)錯誤),job自然也不會運行,但JobRepository是無法偵測到這個錯誤的,因為進程死掉之前沒有對它進行任何通知。你必須手動的告訴它,你知道任務(wù)已經(jīng)失敗了還是說考慮放棄這個任務(wù)(設(shè)置它的狀態(tài)為FAILED或ABANDONED)-這是業(yè)務(wù)邏輯層的事情,無法做到自動決策。

只有在不可重啟的任務(wù)中才需要設(shè)置為FAILED狀態(tài),或者你知道重啟后數(shù)據(jù)還是有效的。Spring Batch Admin中有一系列工具JobService,用以取消正在進行執(zhí)行的任務(wù)。

4、失敗一個job

失敗的job是可以重新啟動的,因為它的狀態(tài)是FAILED,如果step2失敗,則返回一個EARLY TERMINATION的返回碼,step3也就不會執(zhí)行。否則繼續(xù)執(zhí)行step3

<step id="step1" parent="s1" next="step2">
<step id="step2" parent="s2">
    <fail on="FAILED" exit-code="EARLY TERMINATION"/>
    <next on="*" to="step3"/>
</step>
<step id="step3" parent="s3">

5、結(jié)束一個job

已經(jīng)結(jié)束的job是不能重新啟動的,因為它的狀態(tài)是COMPLETED。如果step2失敗了,則step3就不執(zhí)行了,該job也就COMPLETED,結(jié)束了。如果step2成功了,則繼續(xù)往下執(zhí)行step3。

<step id="step1" parent="s1" next="step2">
<step id="step2" parent="s2">
    <end on="FAILED"/>
    <next on="*" to="step3"/>
</step>
<step id="step3" parent="s3">

到此,相信大家對“Spring Batch框架job任務(wù)為什么只跑一次”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI