解决定时任务 (quartz 的job无法注入spring对象)

解决定时任务 (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>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值