符号化によってxxl-jobアクチュエータを手動でトリガーする方法

4221 ワード

前言


xxl-jobは分散型タスクスケジューリングプラットフォームであり、その核心設計目標は開発が迅速で、学習が簡単で、軽量級で、拡張しやすく、開梱してすぐに使用することである.わが部門のほとんどのタイミングタスクスケジューリングはxxl-jobに基づいており、レポート統計、タイミングデータ同期などである.今日の素材は、ある日の製品がレポートデータをタイミングで同期させることを理想とした上で、レポートデータの同期を手動でトリガーする機能を追加したものです.つまり、レポート・ページに手動同期のボタンを追加し、そのボタンをトリガーするとレポート・データ同期を実行できます.

需要分析


1、タイミング同期機能を保留し、同時に手動同期を追加する
2、手動で同期したデータの効果は、タイミングデータの同期の効果と同じである

解決策


1、方案一、手動呼び出しのコントロールを新規作成し、コントロールはデータ同期論理サービスをトリガする
実はxxl-jobアクチュエータに書かれた同期ロジックをcontrollerに置いて実行します
2、シナリオ2、手動呼び出しのcontrollerを新規作成し、controllerの中でxxl-jobアクチュエータを直接トリガする

ソリューション分析


元のタイマシーンでは、タイマ内の同期ロジックがまだ完了していないことを避けるために、次のタイマがトリガしてデータの同期が不正確になることを避けるために、同期完了フラグビットを設定するなど、アクチュエータ内でいくつかの手段を行います.シナリオ1に基づいている場合、シナリオは実行可能に見えるが、潜在的なピットが存在する.すなわち、タイマが実行されると、手動で実行がトリガされるか、逆に、手動でトリガされると、タイマも実行される.これにより、データの同期が複数回実行され、データが不正確になります.
後で私達はxxl-jobを調査して、xxl-jobがrestful風格のトリガアクチュエータを提供する機能があることを見て、この機能はまるで私達のためにオーダーメイドして、手動で呼び出す時、トリガアクチュエータ、実行器の中の呼び出しロジックを実行するため、そのため私達がデータの同期が正確でないことを避けるために取った手段に触れます

restfulスタイルでxxl-jobアクチュエータの実行を手動でトリガーする方法


その具体的な紹介は公式サイトを見ることができて、そのリンクは以下の通りです
https://www.xuxueli.com/xxl-job/#6.2アクチュエータRESTful API
この例のコアコードブロック
@RestController
@RequestMapping(value = "xxl-job")
@Api(tags = "xxl-job restful ")
@Profile("job")
@Slf4j
public class XxlJobController {

    @Autowired
    private XxljobClientHelper xxljobClientHelper;

    @ApiOperation(value = " ")
    @GetMapping("/run")
    public AjaxResult execute(){
        String adminClientAddressUrl = xxljobClientHelper.getAdminClientAddressUrl();
        String accessToken = xxljobClientHelper.getAccessToken();
        log.info("adminClientAddressUrl:{},accessToken:{}", adminClientAddressUrl,accessToken);
        ExecutorBiz executorBiz = new ExecutorBizClient(adminClientAddressUrl, accessToken);
        ReturnT retval = executorBiz.run(getTriggerParam());
        log.info("retval:{}", JSON.toJSONString(retval));
         // 200  、 
        if(retval.getCode() == 200){
            return AjaxResult.success();
        }
        return AjaxResult.error(retval.getMsg(),retval.getCode());
    }

    private TriggerParam getTriggerParam(){
        TriggerParam triggerParam = new TriggerParam();
        //  ID
//        triggerParam.setJobId(15);
        //  
        triggerParam.setExecutorHandler("demoJobHandler");
        //  
        triggerParam.setExecutorParams(" ");
        //  ,  com.xxl.job.core.enums.ExecutorBlockStrategyEnum
        triggerParam.setExecutorBlockStrategy(ExecutorBlockStrategyEnum.COVER_EARLY.name());
        //  ,  com.xxl.job.core.glue.GlueTypeEnum
        triggerParam.setGlueType(GlueTypeEnum.BEAN.name());
        // GLUE 
        triggerParam.setGlueSource(null);
        // GLUE , 
        triggerParam.setGlueUpdatetime(System.currentTimeMillis());
        //  ID
        triggerParam.setLogId(triggerParam.getJobId());
        //  
        triggerParam.setLogDateTime(System.currentTimeMillis());
        return triggerParam;

    }
}

注:コードのdemoJobHandlerは、アクチュエータのスケジューリング方法です.形は次の通り
  /**
     * 1、 (Bean )
     */
    @XxlJob("demoJobHandler")
    public ReturnT demoJobHandler(String param) throws Exception {
        XxlJobLogger.log("XXL-JOB, Hello World.");
        System.out.println("======================param:"+param+"================================ :"+new Random().nextInt(1000));
        return ReturnT.SUCCESS;
    }

まとめ


シナリオ1を選択してもだめではない場合は、グローバルフラグビットを追加したり、フラグビットを設定したりするときに、同時シーンで発生する可能性のある問題を考慮したりするなど、いくつかの改造が必要です.そのため、案2を直接採用したほうがいい.方案の選択は必ず業務シーンに基づいて考慮しなければならなくて、業務シーンに基づいていないで、技術方案を話して、穴を掘りやすいです

demoリンク


https://github.com/lyb-geek/springboot-learning/tree/master/springboot-xxl-job-executor