SpringBootはXxl-jobを統合して、スケジュールされたタスクを実現します
XXL-JOBは分散タスクスケジューリングプラットフォームであり、そのコア設計目標は、迅速な開発、簡単な学習、軽量、および簡単な拡張です。現在、オープンソースであり、箱から出してすぐに多くの企業のオンライン製品ラインに接続されています。
単一のマシンであり、時限タスクが多くない場合は、Timer
アノテーション@Scheduled
またはCron工具类
他の方法を選択してそれを実現できますが、これには欠点があります。つまり、時限タスクがコードに書き込まれ、開始されると、一時停止または変更することはできません。変更した場合は、プロジェクト全体を再コンパイルする必要があり、非常に面倒です。
この記事では、xxl-jobを介してタスクスケジューリングを実装する方法を紹介します
1.展開ディスパッチセンター
1.プロジェクトのダウンロード
以下は、ローカルに植民地化できるディスパッチセンターコードのgiteeアドレスです。
http://gitee.com/xuxueli0323/xxl-job
2.データを初期化します
ダウンロードしたプロジェクトのディレクトリにファイルdoc/db
があります。tables_xxl_job.sql
まずそれを自分のデータベースに入れて実行します。実際には、スケジューリングセンターに必要なテーブル構造とデータを初期化することです。
3.プロパティ構成ファイルを変更します
複製されたプロジェクトをIDEで開き、xxl-job-admin
モジュールの下のプロパティ構成ファイルを変更します。接続データベースのURL、ユーザー名、およびパスワードを自分のものに変更するだけで済みます。変更後、xxl-job-admin
ディスパッチセンターを起動できます。次に、http:// localhost:8080 / xxl-job-admin /を開いて、コントロールパネルを表示します。
次に、SpringBootプロジェクトをデプロイします
1.依存関係を導入する
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.2.0</version>
</dependency>
2.構成クラスを作成します
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appName;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appName);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
3.構成ファイルを変更します
xxl:
job:
admin:
addresses: http://127.0.0.1:8080/xxl-job-admin #部署的调度中心的url
executor:
appname: xxl-job-volunteer-executor #执行器的名字
ip:
port: 9999 #调度中心调用执行器时使用的端口
logpath: /data/apploggs/xxl-job/jobhandler #日志路径
logretentiondays: 30 #日志保留天数
accessToken:
4.エグゼキュータを作成します
@Component
public class XxlJobSample {
// myDemoJob是任务的名字,也是Spring中bean的名字
@XxlJob("myDemoJob")
public ReturnT<String> myDemoJob(String value) {
System.out.println("myDemoJob:定时任务触发:" + value);
return ReturnT.SUCCESS;
}
}
5.SpringBootプロジェクトを開始します
起動が成功すると、次の2行のログ情報が表示されます。スケジューリングセンターに正常に接続し、スケジュールするタスクを登録したことがわかります。
>>>>>>>>>>> xxl-job register jobhandler success, name:myDemoJob, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@1f94dd63[class com.volunteer.component.XxlJobSample#myDemoJob]
>>>>>>>>>>> xxl-job remoting server start success, nettype = class com.xxl.job.core.server.EmbedServer, port = 9999
3.スケジューリングセンターを介したタスクスケジューリング
1.エグゼキュータを追加します
構成ファイルで構成されたappNameを入力します。名前は任意にすることができます
2.タスクを追加します
スケジューリングタスクを追加する
スケジュールされたタスクを表示する
3.タスクスケジューリングセンターがタスクスケジューリングを開始します
SpringBootプロジェクトでは、コンソールが次の情報を出力するのを確認できます。
2022-01-16 11:54:05.039 INFO 7836 --- [Pool-1148366645] c.xxl.job.core.executor.XxlJobExecutor : >>>>>>>>>>> xxl-job regist JobThread success, jobId:7, handler:com.xxl.job.core.handler.impl.MethodJobHandler@1f94dd63[class com.volunteer.component.XxlJobSample#myDemoJob]
myDemoJob:定时任务触发:testParam
2022-01-16 11:55:38.059 INFO 7836 --- [ Thread-22] com.xxl.job.core.thread.JobThread : >>>>>>>>>>> xxl-job JobThread stoped, hashCode:Thread[Thread-22,10,main]
4.まとめ
これまでのところ、SpringBootによるXxl-jobの統合は完了しています。現在のサンプルコードは、実際には元のプロジェクトに非常に煩わしいものです。上記はBEAN
実行モードを示しているだけです。率直に言って、added@XxlJob
メソッドを呼び出します。実際、タスクを作成するときにこの実行モードを使用することもできますGLUE(Java)
。このメソッドは、実際に入力したJavaコードを実行します。このメソッドは、元のプロジェクトに依存関係や構成を追加する必要はありません。スケジュールされたタスクの場合、必要なのはトリガーするインターフェイスを作成するとGLUE(Java)
、タスクは定期的に公開されたインターフェイスを要求します
コードスニペットは次のとおりです。
public class DemoGlueJobHandler extends IJobHandler {
@Override
public void execute() throws Exception {
XxlJobHelper.log("定时任务执行了一次");
HttpRequest.post("http://localhost:8088/oos/test")
.header(Header.USER_AGENT, "xxl-job")//头信息,多个头信息多次调用此方法即可
.timeout(20000)//超时,毫秒
.execute();
}
}
上記のコードは実際にはエグゼキュータで実行され、テストで実行して、問題がなければ貼り付けることができます(インポートやその他の情報のコピーにも注意してください)
以上が本日の全内容です。詳しく知りたい方は公式資料をご覧ください。