2.定时器任务
用的是quartz调度工厂
其中涉及到cron表达式(定时器时间设置),cron表达式生成网址 http://cron.qqe2.com/
Quartz使用方法:
1.Job接口:TelegraphloadJob,需要继承job接口,并实现execute方法,实现同步任务
2.JobInstance:MyJobFactory中实现Job实例
3.Scheduler:MyScheduler,代表一个Quartz的独立运行容器,JobInstance可以注册到Scheduler中
1.配置文件:通过createJobInstance自动加载定时器任务
@Component
public class MyJobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
// 调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
// 进行注入
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
2.设置启动项目
@Component
public class MyScheduler {
@Autowired
SchedulerFactoryBean schedulerFactoryBean;
/**
* @函数名称:scheduleJobs
* @创建日期:2017年9月11日
* @功能说明:定义quartz调度工厂
* @参数说明:
* @返回说明:void
*/
public void scheduleJobs() throws SchedulerException {
startJobs();
}
private void startJobs() throws SchedulerException {
try {
Object[] params = new Object[] {};
// 运单
QuartzManager.addJob(schedulerFactoryBean, "awbJob", "awbJob", "awbTrigger", "awbTrigger",
AwbJob.class, "0/30 * * * * ? *", params);
// 运单删除
QuartzManager.addJob(schedulerFactoryBean, "awbHistoryJob", "awbHistoryJob", "awbHistoryTrigger", "awbHistoryTrigger",
AwbHistoryJob.class, "0 0/1 * * * ? *", params);
//电报信息
QuartzManager.addJob(schedulerFactoryBean, "TelegraphUploadJob", "TelegraphUploadJob", "TelegraphUploadTrigger", "TelegraphUploadTrigger",
TelegraphUploadJob.class, "0 0/1 * * * ? *", params);
// 议价申请及删除
QuartzManager.addJob(schedulerFactoryBean, "awbBargainJob", "awbBargainJob", "awbBargainTrigger", "awbBargainTrigger",
AwbBargainJob.class, "0 0/1 * * * ? *", params);
// 航班走货明细存储过程-2分钟更新一次
QuartzManager.addJob(schedulerFactoryBean, "ProcSyncLoadCancleJob", "ProcSyncLoadCancleJob", "ProcSyncLoadCancleTrigger", "ProcSyncLoadCancleTrigger",
ProcSyncLoadCancleJob.class, "0 0/2 * * * ? *", params);
// 正在制单状态超过10分钟的电子托运书, 恢复成可制单
QuartzManager.addJob(schedulerFactoryBean, "ShipEbookStatusJob", "ShipEbookStatusJob", "ShipEbookStatusTrigger", "ShipEbookStatusTrigger",
ShipEbookStatusJob.class, "0 0/10 * * * ? *", params);
// 定时删除电子托运书无效数据 每天0点执行
QuartzManager.addJob(schedulerFactoryBean, "ShipCheckJob", "ShipCheckJob", "ShipCheckTrigger", "ShipCheckTrigger",
ShipCheckJob.class, "0 0 0 * * ? *", params);
// 统禁用OA中作废账号-每小时更新一次
QuartzManager.addJob(schedulerFactoryBean, "UserAccountJob", "UserAccountJob", "UserAccountTrigger", "UserAccountTrigger",
UserAccountJob.class, "0 0 0/1 * * ? *", params);
// 动态航班状态
QuartzManager.addJob(schedulerFactoryBean, "ProcSyncFlightStatusJob", "ProcSyncFlightStatusJob", "ProcSyncFlightStatusTrigger", "ProcSyncFlightStatusTrigger",
ProcSyncFlightStatusJob.class, "0 0/5 * * * ? *", params);
// 议价自动批复 每天0点执行
QuartzManager.addJob(schedulerFactoryBean, "AutomaticBargainJob", "AutomaticBargainJob", "AutomaticBargainTrigger", "AutomaticBargainTrigger",
AutomaticBargainJob.class, "0 0 0 * * ? *", params);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.配置启动
/**
* @功能说明:
* @创建人员:zhenghb
* @变更记录:<BR>
* 1、2017年9月2日 zhenghb 新建类
*/
@Configuration
public class SchedulerListener implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
public MyScheduler myScheduler;
@Autowired
private MyJobFactory myJobFactory;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
try {
myScheduler.scheduleJobs();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setStartupDelay(5);
schedulerFactoryBean.setJobFactory(myJobFactory);
return schedulerFactoryBean;
}
}
4.进入正文:如何产生一个定时器任务?
详解析:1.首先service层与dao层定时上传
2.Job启动
3.MyScheduler 配置job
@DisallowConcurrentExecution
public class TelegraphUploadJob implements Job, Serializable {
/**
*
*/
private static final long serialVersionUID = -4729809338538061687L;
private final Logger log = LoggerFactory.getLogger(getClass());
@Autowired
private ISyncTaskLogService syncTaskLogService;
@Autowired
private SyncTaskDao syncTaskDao;
@Autowired
private ITelegraphUploadService telegraphUploadService;
/**
* 将电报同步到新地面系统
*/
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
String msg = "同步成功!";
SyncTaskLog syncTaskLog = new SyncTaskLog();
log.info("开始同步电报信息数据");
Date date = new Date();
syncTaskLog.setStartTime(date);
String msgs = "";
// 判断服务是否启动
Integer isEnable = syncTaskDao.getIsEnable(SyncTask.SYNCTELEINFO.getCode());
if (isEnable != null && isEnable == 1) {
try {
//查询未同步和同步失败的数据
List<TelegraphInfo> telegraphInfos = telegraphUploadService.findValidTele();
for (TelegraphInfo tele : telegraphInfos) {
if (StringUtils.isNotBlank(tele.getGoodsName())) {
tele.setCneAddress(tele.getCneAddress().replaceAll(""", "\"")
.replaceAll("<", "<")
.replaceAll(">", ">")
.replaceAll("(", "(")
.replaceAll(")", ")")
.replaceAll("'", "'"));
}
if (StringUtils.isNotBlank(tele.getUpdateInfo())) {
tele.setUpdateInfo(tele.getUpdateInfo().replaceAll(""", "\"")
.replaceAll("<", "<")
.replaceAll(">", ">")
.replaceAll("(", "(")
.replaceAll(")", ")")
.replaceAll("'", "'"));
}
if (StringUtils.isNotBlank(tele.getCneAddress())) {
tele.setCneAddress(tele.getCneAddress().replaceAll(""", "\"")
.replaceAll("<", "<")
.replaceAll(">", ">")
.replaceAll("(", "(")
.replaceAll(")", ")")
.replaceAll("'", "'"));
}
try {
//上传至新地面系统
msgs = telegraphUploadService.syncTelegraphInfo(tele);
} catch (Exception e) {
msgs = "同步失败!";
}
if ("同步失败!".equals(msgs)) {
msg = msgs;
}
}
log.info(msg);
} catch (Exception e) {
log.error(msg);
e.printStackTrace();
syncTaskLog.setException(e.toString());
}
date = new Date();
syncTaskLog.setEndTime(date);
if ("同步失败!".equals(msg)) {
syncTaskLog.setSyncStatus(BoolStatus.N.getId());
} else {
syncTaskLog.setSyncStatus(BoolStatus.Y.getId());
}
syncTaskLog.setUpdateTime(date);
syncTaskLog.setTaskCode(SyncTask.SYNCTELEINFO.getCode());
try {
syncTaskLogService.saveSyncTaskLog(syncTaskLog);
} catch (Exception e) {
log.error("同步电报信息错误", e);
e.printStackTrace();
}
}
}
}