的作業分類基于
ElasticJob
和
class
兩種類型。基于
type
的作業需要開發者自行通過實作接口的方式織入業務邏輯;基于
class
的作業則無需編碼,隻需要提供相應配置即可。基于
type
的作業接口的方法參數
class
包含作業配置、片和運作時資訊。可通過
shardingContext
、
getShardingTotalCount()
getShardingItem()
等方法分别擷取分片總數和運作在本作業伺服器的分片序列号等。
目前提供
ElasticJob
、
Simple
這兩種基于
Dataflow
的作業類型,并提供
class
、
Script
這兩種基于
HTTP
的作業類型,使用者可通過實作
type
接口自行擴充作業類型。
SPI
本篇部落格介紹
Script
作業。
添加依賴(
3.0.1
是目前最新的
Releases
版本):
<dependency>
<groupId>org.apache.shardingsphere.elasticjob</groupId>
<artifactId>elasticjob-lite-core</artifactId>
<version>3.0.1</version>
</dependency>
Script作業
ElasticJob
支援
shell
、
python
以及
perl
等所有類型腳本。可通過屬性
script.command.line
配置待執行腳本,無需編碼。執行腳本路徑可包含參數,參數傳遞完畢後,作業架構會自動追加最後一個參數為作業運作時資訊。
package com.kaven.job;
import org.apache.shardingsphere.elasticjob.api.JobConfiguration;
import org.apache.shardingsphere.elasticjob.lite.api.bootstrap.impl.ScheduleJobBootstrap;
import org.apache.shardingsphere.elasticjob.reg.base.CoordinatorRegistryCenter;
import org.apache.shardingsphere.elasticjob.reg.zookeeper.ZookeeperConfiguration;
import org.apache.shardingsphere.elasticjob.reg.zookeeper.ZookeeperRegistryCenter;
/**
* @Author: ITKaven
* @Date: 2021/11/20 17:05
* @Leetcode: https://leetcode-cn.com/u/kavenit
* @Notes:
*/
public class Application {
public static void main(String[] args) {
new ScheduleJobBootstrap(createRegistryCenter(), "SCRIPT",
createJobConfiguration()).schedule();
}
private static CoordinatorRegistryCenter createRegistryCenter() {
ZookeeperConfiguration zc = new ZookeeperConfiguration("192.168.1.184:9000", "my-job");
zc.setConnectionTimeoutMilliseconds(40000);
zc.setMaxRetries(5);
CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(zc);
regCenter.init();
return regCenter;
}
private static JobConfiguration createJobConfiguration() {
return JobConfiguration.newBuilder("MyScriptJob", 3)
.description("腳本作業")
.cron("30 * * * * ?")
.setProperty("script.command.line", "python F:\\workspace\\IDEA\\my\\job\\src\\main\\java\\com\\kaven\\job\\script.py")
.overwrite(true)
.failover(true)
.build();
}
}
elasticJobType
參數需要全部大寫(比如
SCRIPT
和
HTTP
)。
new ScheduleJobBootstrap(createRegistryCenter(), "SCRIPT",
createJobConfiguration()).schedule();
定義腳本作業隻需要一行(這裡腳本路徑是絕對路徑)。
.setProperty("script.command.line", "python F:\\workspace\\IDEA\\my\\job\\src\\main\\java\\com\\kaven\\job\\script.py")
script.py
:
import sys
import time
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), ':', sys.argv[-1])
輸出如下圖所示:
腳本路徑也可以使用相對路徑(相對于項目的路徑
F:\\workspace\\IDEA\\my\\job
)。
.setProperty("script.command.line",
"python .\\src\\main\\java\\com\\kaven\\job\\script.py")
參數
給腳本傳參數,就跟手動執行腳本一樣,在指令後面添加參數即可。
private static JobConfiguration createJobConfiguration() {
return JobConfiguration.newBuilder("MyScriptJob4", 3)
.description("腳本作業")
.cron("30 * * * * ?")
.setProperty("script.command.line",
"python F:\\workspace\\IDEA\\my\\job\\src\\main\\java\\com\\kaven\\job\\script.py kaven")
.overwrite(true)
.failover(true)
.build();
}
修改腳本:
import sys
import time
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), ':', sys.argv[:])
輸出如下圖所示: