唯品会分布式任务调度平台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
上一篇: php中创建和调用webservice接口示例_PHP
下一篇: 一个功能还算完整的数据库操作类