解决定时任务 (quartz 的job无法注入spring对象)
下面监听中 SchedulerCenter.scheduler(“job1”, “test”, BdcTyslPushJob.class);
我们是通过class 加载的类 不是通过spring容器加载,spring不会帮我们托管
这时候我们就要使用spring-quartz提供的AdaptableJobFactory
监听启动类
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import com.zy.restful.job.BdcTyslPushJob;
import com.zy.restful.scheduler.SchedulerCenter;
public class MyListenter implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// TODO Auto-generated method stub
if (event.getApplicationContext().getParent() == null) {
try {
// 启动netty
new Thread(new Runnable() {
@Override
public void run() {
try {
SchedulerCenter.scheduler("job1", "test", BdcTyslPushJob.class);
System.err.println("=================启动==================");
} catch (Exception e) {
e.printStackTrace();
System.err.println("================异闭==================");
}
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
使用spring-quartz提供的AdaptableJobFactory进行注入
自定义一个类继承 AdaptableJobFactory 实现注入
package com.zy.restful.scheduler;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
public class SpringQuartzJobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory beanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object obj = super.createJobInstance(bundle);
beanFactory.autowireBean(obj);
return obj;
}
}
触发器
package com.zy.restful.scheduler;
import java.util.Properties;
import org.quartz.CronScheduleBuilder;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.zy.restful.job.BdcTyslPushJob;
import com.zy.restful.util.PropertiesUtil;
@Component
public class SchedulerCenter {
// quartz配置文件
//public static String fileName = "/quartz.properties";
private static final Logger logger = LoggerFactory.getLogger(SchedulerCenter.class);
public static void scheduler(String jobName, String triggerCronName, Class<? extends Job> clazz) {
SchedulerFactory schedulerfactory = null;
Scheduler scheduler = null;
Properties props = new Properties();
try {
//props.load(SchedulerCenter.class.getResourceAsStream(fileName));
// 通过schedulerFactory获取一个调度器
//schedulerfactory = new StdSchedulerFactory(props);
schedulerfactory = new StdSchedulerFactory();
// 通过schedulerFactory获取一个调度器
scheduler = schedulerfactory.getScheduler();
// 创建jobDetail实例,绑定Job实现类
// 指明job的名称,所在组的名称,以及绑定job类
JobDetail jobTask = JobBuilder.newJob(clazz).withIdentity(jobName, "jobs").build();
// 触发器设置
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, "jobTrigger")
.withSchedule(CronScheduleBuilder.cronSchedule(PropertiesUtil.getProp(triggerCronName))).startNow()
.build();
// 把作业和触发器注册到任务调度中
scheduler.scheduleJob(jobTask, trigger);
// 启动调度
scheduler.start();
logger.info("========================================添加任务成功" + jobName
+ "到触发器============================================");
} catch (Exception e) {
e.printStackTrace();
}
}
}
具体要执行的job任务
package com.zy.restful.job;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import com.zy.restful.common.Result;
import com.zy.restful.common.RsRequest;
import com.zy.restful.mapper.AcceptMapper;
import com.zy.restful.model.AcceptInfo;
import com.zy.restful.util.XstreamParser;
public class BdcTyslPushJob implements Job{
@Autowired
private RsRequest rsRequest;
@Autowired
private AcceptMapper acceptMapper;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
// TODO Auto-generated method stub
int sucCount = 0;
int infoCount = 0;
Map<String, Object> map = new HashMap<String, Object>();
String url = "http://16.100.60.68:8001/api/accept";
List<AcceptInfo> acceptInfo = acceptMapper.selectAcceptInfo();
if (acceptInfo != null && acceptInfo.size() > 0) {
infoCount = acceptInfo.size();
for (int i = 0; i < acceptInfo.size(); i++) {
AcceptInfo accept = acceptInfo.get(i);
accept.setPROJID("");
// accept.setBASE_CODE("");
String accept2Xml = XstreamParser.Accept2Xml(accept);
String acceptInfoXml = "<?xml version=\"1.0\" encoding=\"gb2312\"?>" + accept2Xml;
System.out.println(acceptInfoXml);
map.put("acceptInfoXml", acceptInfoXml);
Result rquest = rsRequest.rquest(url, map);
System.out.println("-------------------------------------------");
System.out.println(rquest);
if ("01".equals(rquest.getResult())) {
System.out.println("是否已经成功插入数据");
sucCount++;
accept.setFLAG("1");
// 已经推送成功的数据插入数据库
acceptMapper.insertResultInfo(accept);
}
}
}
System.out.println("数据推送成功条数" + sucCount + ";失败条数" + (infoCount - sucCount));
}
}
quartz.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<bean id="scheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="autoStartup" value="true" />
<property name="startupDelay" value="20" />
<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
<property name="configLocation" value="classpath:quartz.properties" />
<property name="jobFactory">
<bean class="com.zy.restful.scheduler.SpringQuartzJobFactory" />
</property>
</bean>
<!-- <bean class="bdc.schedule.ScheduleSpringListener" /> -->
</beans>