欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

唯品会分布式任务调度平台Saturn使用手册

程序员文章站 2022-06-17 17:06:30
...

本文将使用SSM框架来创建Saturn 定时任务。

1. 确定saturn console能否访问 ip+:9088 例如:192.168.1.xxx:9088

2. 在pom.xml添加dependency

<dependency> 
    <groupId>com.vip.saturn</groupId> 
    <artifactId>saturn-job-api</artifactId> 
    <!-- 修改成指定版本 --> 
    <version>3.0.1</version> 
</dependency>

以及plugin

<plugin> 
    <groupId>com.vip.saturn</groupId> 
    <artifactId>saturn-plugin</artifactId> 
    <!-- 版本与saturn-job-api一致 --> 
    <version>3.0.1</version> 
</plugin>

注意:3.0.1版本不是Saturn最新版本,可根据自己需求选择不同的版本。

3. 在创建Job类之前要创建工厂来加载类。

  MySpringApplicationContext.java

public class MySpringApplicationContext extends AbstractXmlApplicationContext {

	private Resource[] configResources;

	public MySpringApplicationContext(Resource[] configResources) throws BeansException {
		this(configResources, true, null, null);
	}

	public MySpringApplicationContext(Resource[] configResources, ClassLoader classLoader) throws BeansException {
		this(configResources, true, null, classLoader);
	}

	public MySpringApplicationContext(Resource[] configResources, boolean refresh, ApplicationContext parent,
			ClassLoader classLoader) throws BeansException {
		super(parent);
		if (classLoader != null) {
			this.setClassLoader(classLoader);
		}
		this.configResources = configResources;
		if (refresh) {
			refresh();
		}
		// 注册关闭钩子
		registerShutdownHook();
	}

	protected Resource[] getConfigResources() {
		return this.configResources;
	}

}

  SpringFactory.java

  通过MySpringApplicationContext加载需要的xml配置文件,可根据自己需求来加载需要的xml配置文件。

public class SpringFactory {

    private static final String APPLICATION_CONTEXT_ROOT = "spring/applicationContext-root.xml";
    
    private static final String APPLICATION_CONTEXT_MQ = "spring/applicationContext-mq.xml";
    
    private static final String APPLICATION_CONTEXT_PERSISTENCE = "spring/applicationContext-persistence.xml";
    
    private static SpringFactory instance = new SpringFactory();

    public static SpringFactory getInstance() {
        return instance;
    }

    private BeanFactory factory;

    public Object getObject(String beanId) {
        return factory.getBean(beanId);
    }

    private SpringFactory() {
        List<Resource> resources = new ArrayList<Resource>();

        resources.add(new ClassPathResource(APPLICATION_CONTEXT_ROOT));
        resources.add(new ClassPathResource(APPLICATION_CONTEXT_MQ));
        resources.add(new ClassPathResource(APPLICATION_CONTEXT_PERSISTENCE));

        Resource[] resourceArrays = new Resource[resources.size()];
        try {
            ApplicationContext context = new MySpringApplicationContext(resources.toArray(resourceArrays));
            factory = (BeanFactory) context;
        } catch (RuntimeException e) {
            e.printStackTrace();
            throw e;
        }

    }

}

4. 修改现在类或者增加一个新的类,继承自AbstractSaturnJavaJob ,实现 handleJavaJob方法。

@Component
public class SaturnTest extends AbstractSaturnJavaJob {
    
    @Override
    public SaturnJobReturn handleJavaJob(String jobName, Integer shardItem, String shardParam,SaturnJobExecutionContext shardingContext) {
        SaturnTest instance = (SaturnTest ) SpringFactory.getInstance().getObject("saturnTest");
        saturnJobReturn = new SaturnJobReturn("分片:" + shardParam);
        instance.svResult(instance);
        return saturnJobReturn;

    }
}

  如果捕获Exception后要任务显示失败要设置ErrorGroup=500,同时可以在returnMsg设置一些返回信息

catch (Exception e) {
            saturnJobReturn.setErrorGroup(500);
            saturnJobReturn.setReturnMsg("*********数据异常" + e.getMessage());
            logger.error("**********取得数据异常", Throwables.getStackTraceAsString(e));
        }

 如下为Saturn提供的状态码。

public final class SaturnSystemErrorGroup {

	public static final int SUCCESS = 200;

	// general fail
	public static final int FAIL = 500;

	public static final int TIMEOUT = 550;

	// alarm will be raised with this error code
	public static final int FAIL_NEED_RAISE_ALARM = 551;

	public static Set<Integer> getAllSystemErrorGroups(){
		Set<Integer> resultSet = new HashSet<>();
		resultSet.add(SUCCESS);
		resultSet.add(FAIL);
		resultSet.add(TIMEOUT);
		resultSet.add(FAIL_NEED_RAISE_ALARM);

		return resultSet;
	}

}

5.eclipse调试作业

唯品会分布式任务调度平台Saturn使用手册

  • com.vip.saturn:saturn-plugin:3.0.1:run -Dnamespace=部署console的URI -DexecutorName=执行器的名称(随意起名) -DVIP_SATURN_CONSOLE_URI=http://192.168.xx.xx.:9088

唯品会分布式任务调度平台Saturn使用手册

-Dspring.profiles.active=dev

 

注:namespace要修改为使用的域名,URI要修改为正确的地址,executorName为执行节点名称

6.saturn console添加java作业

唯品会分布式任务调度平台Saturn使用手册

  • 作业类型: 分为Java定时作业和Shell定时作业,这里选择Java定时作业
  • 作业名:作业ID标识,namespace下必须唯一
  • 作业实现类:作业实现类的完整包名+类名
  • cron表达式:作业定时表达式
  • 作业分片总数:表示并发执行的数量,2代表该作业同时有两个进程在并发执行,每个进程都有自己专门的脚本和参数(这些进程可能同跑在不同机器上的)。

注:优先Executor:如果你想选择特定的物理机executor去运行你的作业,则需要设置优先executor。下拉框的候选项为当前域下的所有在线的executor。只使用优先Executor:如果优先executor离线了,不会failover到其他机器,在本机测试作业的时候要勾选只使用优先executor。 

注:分片数可根据需求来定

  • 分片***/参数对照表:定义每个分片执行的完整脚本路径及参数。这是saturn最重要的参数之一。

注:由于分片个数为1,所以分片参数只需要一个键值对(0=local01)key值为0,value:实际填写时要使用executorName作为value值,。

  • 作业描述信息 :作业描述
  • 更多高级的配置,可以在作业编辑页面进行编辑(根据自身需要来定)

唯品会分布式任务调度平台Saturn使用手册

在eclipse控制台会看到日志

7.如果上述步骤没有问题,则意味着作业在本地验证通过。现在可以进行部署了。

saturn:zip

唯品会分布式任务调度平台Saturn使用手册