本文将使用SSM框架来创建Saturn 定时任务。
1. 确定saturn console能否访问 ip+:9088 例如:192.168.1.xxx:9088
2. 在pom.xml添加dependency
com.vip.saturn
saturn-job-api
3.0.1
以及plugin
com.vip.saturn
saturn-plugin
3.0.1
注意: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 resources = new ArrayList();
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 getAllSystemErrorGroups(){
Set resultSet = new HashSet<>();
resultSet.add(SUCCESS);
resultSet.add(FAIL);
resultSet.add(TIMEOUT);
resultSet.add(FAIL_NEED_RAISE_ALARM);
return resultSet;
}
}
5.eclipse调试作业
-Dspring.profiles.active=dev
注:namespace要修改为使用的域名,URI要修改为正确的地址,executorName为执行节点名称
6.saturn console添加java作业
注:优先Executor:如果你想选择特定的物理机executor去运行你的作业,则需要设置优先executor。下拉框的候选项为当前域下的所有在线的executor。只使用优先Executor:如果优先executor离线了,不会failover到其他机器,在本机测试作业的时候要勾选只使用优先executor。
注:分片数可根据需求来定
注:由于分片个数为1,所以分片参数只需要一个键值对(0=local01)key值为0,value:实际填写时要使用executorName作为value值,。
在eclipse控制台会看到日志
7.如果上述步骤没有问题,则意味着作业在本地验证通过。现在可以进行部署了。
saturn:zip