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

本文将使用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调试作业

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

-Dspring.profiles.active=dev

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

6.saturn console添加java作业

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

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

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

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

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

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

在eclipse控制台会看到日志

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

saturn:zip

猜你喜欢

转载自blog.csdn.net/qq_34982426/article/details/82153376