天天看點

ElasticJob‐Lite:Script作業

​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])      

輸出如下圖所示:

ElasticJob‐Lite:Script作業
ElasticJob‐Lite:Script作業

腳本路徑也可以使用相對路徑(相對于項目的路徑​

​F:\\workspace\\IDEA\\my\\job​

​)。

.setProperty("script.command.line",
                        "python .\\src\\main\\java\\com\\kaven\\job\\script.py")      
ElasticJob‐Lite:Script作業

參數

給腳本傳參數,就跟手動執行腳本一樣,在指令後面添加參數即可。

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[:])      

輸出如下圖所示:

ElasticJob‐Lite:Script作業
ElasticJob‐Lite:Script作業

繼續閱讀