アプリケーションを作成した後、タスクを実行するためにエグゼキュータを接続する必要があります。
標準アプリケーションをエグゼキュータに接続する
自動登録
自動登録を使用するには、アプリケーションが XXL-JOB SDK に依存している必要があります。接続設定を構成すると、アプリケーションの起動時にエグゼキュータが自動的に登録されます。
1. 接続設定の表示
MSE XXL-JOB コンソールにログインします。
ページの左上隅で、[リージョン] を選択します。
ターゲットインスタンス ID をクリックします。左側のナビゲーションウィンドウで、[アプリケーション管理] を選択します。
ターゲットアプリケーションを見つけます。[エグゼキュータ数] 列で、[接続] ボタンをクリックします。
接続タイプとして [自動登録] を選択し、構成を完了します。
2. SDK をインポートしてエグゼキュータを接続する
Java SDK
pom.xml ファイルに `xxl-job-core` Maven 依存関係を追加します。
エグゼキュータを初期化します。
@Configuration public class XxlJobConfig { private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); @Value("${xxl.job.admin.addresses}") private String adminAddresses; @Value("${xxl.job.accessToken}") private String accessToken; @Value("${xxl.job.executor.appname}") private String appname; @Value("${xxl.job.executor.address}") private String address; @Value("${xxl.job.executor.ip}") private String ip; @Value("${xxl.job.executor.port}") private int port; @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.setAddress(address); xxlJobSpringExecutor.setIp(ip); xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor; } }
Go SDK
次のコマンドを実行して、最新のタグを使用して XXL-JOB Go SDK をプルします。
go get github.com/xxl-job/xxl-job-executor-go@{latest_tag}アプリケーションコードを記述します。
package main import ( "context" "fmt" xxl "github.com/xxl-job/xxl-job-executor-go" "github.com/xxl-job/xxl-job-executor-go/example/task" "log" ) func main() { exec := xxl.NewExecutor( xxl.ServerAddr("xxxxxx"), // リクエストアドレス。コンソールのアプリケーション管理セクションの接続設定から取得します。 xxl.AccessToken("xxxxxxx"), // アクセストークン。コンソールのアプリケーション管理セクションの接続設定から取得します。 xxl.ExecutorPort("9999"), // デフォルトのポートは 9999 です。このパラメーターはオプションです。 xxl.RegistryKey("golang-jobs"), // エグゼキュータの名前。 xxl.SetLogger(&logger{}), // カスタムロガー。 ) exec.Init() exec.Use(customMiddleware) // ログ表示用のハンドラを設定します。 exec.LogHandler(customLogHandle) // タスクハンドラを登録します。 exec.RegTask("task.test", task.Test) exec.RegTask("task.test2", task.Test2) exec.RegTask("task.panic", task.Panic) log.Fatal(exec.Run()) } // カスタムログハンドラ。 func customLogHandle(req *xxl.LogReq) *xxl.LogRes { return &xxl.LogRes{Code: xxl.SuccessCode, Msg: "", Content: xxl.LogResContent{ FromLineNum: req.FromLineNum, ToLineNum: 2, LogContent: "This is a custom log handler.", IsEnd: true, }} } // xxl.Logger インターフェイスの実装。 type logger struct{} func (l *logger) Info(format string, a ...interface{}) { fmt.Println(fmt.Sprintf("Custom log - "+format, a...)) } func (l *logger) Error(format string, a ...interface{}) { log.Println(fmt.Sprintf("Custom log - "+format, a...)) } // カスタムミドルウェア。 func customMiddleware(tf xxl.TaskFunc) xxl.TaskFunc { return func(cxt context.Context, param *xxl.RunReq) string { log.Println("I am a middleware start") res := tf(cxt, param) log.Println("I am a middleware end") return res } }
Python SDK
依存関係をインストールします。
pip install pyxxl # ログを Redis に書き込むには pip install "pyxxl[redis]" # .env ファイルから構成を読み込むには pip install "pyxxl[dotenv]" # すべての機能をインストールするには pip install "pyxxl[all]"アプリケーションコードを記述します。
import asyncio import time from pyxxl import ExecutorConfig, PyxxlRunner from pyxxl.ctx import g config = ExecutorConfig( xxl_admin_baseurl="http://xxljob-1b3fd8196eb.schedulerx.mse.aliyuncs.com/api/", executor_app_name="xueren-test", access_token="default_token", # executor_listen_host="0.0.0.0", # xxl-admin がエグゼキュータの IP アドレスに直接接続できる場合、executor_listen_host を指定する必要はありません。 ) app = PyxxlRunner(config) @app.register(name="demoJobHandler") async def test_task(): # "g" を使用してタスクパラメーターを取得できます g.logger.info("get executor params: %s" % g.xxl_run_data.executorParams) for i in range(10): g.logger.warning("test logger %s" % i) await asyncio.sleep(5) return "Success..." @app.register(name="sync_func") def test_task4(): # xxl-admin で実行ログを表示するには、ログ出力に g.logger を使用する必要があります。デフォルトでは、INFO レベル以上のログのみが出力されます。 n = 1 g.logger.info("Job %s get executor params: %s" % (g.xxl_run_data.jobId, g.xxl_run_data.executorParams)) # 同期タスクにループが含まれている場合、キャンセル操作をサポートするには、各反復で g.cancel_event をチェックする必要があります。 while n <= 10 and not g.cancel_event.is_set(): # xxl-admin からログを表示する必要がない場合は、独自のロガーを使用できます。 g.logger.info( "log to {} logger test_task4.{},params:{}".format( g.xxl_run_data.jobId, n, g.xxl_run_data.executorParams, ) ) time.sleep(2) n += 1 return "Success 3" if __name__ == "__main__": app.run_executor()
手動入力
エグゼキュータアドレスは手動で管理できます。アドレスは http://192.168.0.1:9999/ のフォーマットである必要があります。
MSE XXL-JOB コンソールにログインします。
ページの左上隅で、[リージョン] を選択します。
ターゲットインスタンス ID をクリックします。左側のナビゲーションウィンドウで、[アプリケーション管理] を選択します。
ターゲットアプリケーションを見つけます。[エグゼキュータ数] 列で、[接続] ボタンをクリックします。
[接続タイプ] を [手動入力] に設定し、[エグゼキューターアドレス] を入力します。
HTTP アプリケーションをエグゼキュータに接続する
HTTP アプリケーションを接続するのに SDK は必要ありません。代わりに、ドメイン名または Kubernetes サービスを構成して、バックエンドノードを自動的に検出し、HTTP プロトコルをスケジューリングに使用できます。
Kubernetes サービスに接続する
HTTP アプリケーションが Alibaba Cloud Container Service for Kubernetes (ACK) にデプロイされている場合、Kubernetes サービスを使用して接続できます。
(オプション) ACK にアプリケーションをデプロイします。次のクラスタータイプがサポートされています:
Terway ネットワークプラグインを備えた ACK マネージドクラスター
ACK Serverless クラスター
ACS クラスター
(オプション) ACK でアプリケーションのサービスを作成します。次のサービスタイプがサポートされています:
ClusterIP
LoadBalancer
MSE XXL-JOB コンソールにログインします。
ページの左上隅で、[リージョン] を選択します。
ターゲットインスタンス ID をクリックします。左側のナビゲーションウィンドウで、[アプリケーション管理] を選択します。
ターゲットアプリケーションを見つけます。[エグゼキュータ数] 列で、[接続] ボタンをクリックします。
[エグゼキュータの接続] ページで、接続タイプに [K8s サービスに接続] を選択し、パラメーター設定を完了して、[OK] をクリックして接続を完了します。
接続が確立されると、エグゼキュータ数が更新されます。数字をクリックすると、バックエンド Pod のリストを表示できます。
ドメイン名の手動入力
アプリケーションが ACK にデプロイされていない場合 (ECS インスタンス上など)、内部ドメイン名を使用して HTTP タスクをスケジュールできます。
(オプション) HTTP アプリケーションのゲートウェイを作成します。内部ドメイン名が自動的に生成されます。たとえば、Network Load Balancer (NLB) を使用できます。
ページの左上隅で、[リージョン] を選択します。
ターゲットインスタンス ID をクリックします。左側のナビゲーションウィンドウで、[アプリケーション管理] を選択します。
ターゲットアプリケーションを見つけます。[エグゼキュータ数] 列で、[接続] ボタンをクリックします。
[エグゼキュータの接続] ページで、接続タイプを [ドメイン名の入力] に設定し、内部の同一リージョンエンドポイントを構成します。