一般情况下,quartz的job中使用autowired注解注入的对象为空,这时候我们就要使用spring-quartz提供的AdaptableJobFactory类。
<bean id="IJobLogService" class="org.ssm.dufy.service.impl.IJobLogServiceImpl"></bean>
<bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
<property name="dataSource" ref ="dataSource" />
<property name="schedulerContextAsMap">
<map>
<!-- spring 管理的service需要放到这里,才能够注入成功 -->
<description>schedulerContextAsMap</description>
<entry key="IJobLogService" value-ref="IJobLogService"/>
</map>
</property>
<property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>
<property name="configLocation" value="classpath:quartz.properties"/>
</bean>
首先将service的实现类作为一个普通的bean注入到spring ,然后按照上述配置的方法设置name为quartzScheduler的bean,设置schedulerContextAsMap属性,若要设置多个service,可以设置多个<entry>
public class HelloWorldJob extends QuartzJobBean{
@Autowired
private IJobLogServiceImpl iJobLogService;
Log logger = LogFactory.getLog(HelloWorldJob.class);
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
//获取JobExecutionContext中的service对象
try {
SchedulerContext skedCtx = context.getScheduler().getContext();
iJobLogService=(IJobLogServiceImpl)skedCtx.get("IJobLogService");
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JobMsg jobMsg=new JobMsg();
jobMsg.setId(1);
jobMsg.setMsg("from HelloWorldJob");
jobMsg.setTrg("");
jobMsg.setMark((new Date()).toString());
iJobLogService.insertJobMsg(jobMsg);
}
quartz.properties设置
# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName: quartzScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 2
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.misfireThreshold: 60000
#============================================================================
# Configure JobStore
#============================================================================
#default config
#org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
#\u6301\u4e45\u5316\u914d\u7f6e
org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties:true
#============================================================================
#havent cluster spring
#============================================================================
org.quartz.jobStore.isClustered = false
#\u6570\u636e\u5e93\u8868\u524d\u7f00
org.quartz.jobStore.tablePrefix:qrtz_
#org.quartz.jobStore.dataSource:qzDS
#============================================================================
# Configure Datasources
#============================================================================
#JDBC\u9A71\u52A8 Sping\u53BB\u7BA1\u7406dataSource \uFF0C\u8FD9\u91CC\u4E0D\u5728\u914D\u7F6E\u6570\u636E\u6E90\u4FE1\u606F
#org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
#org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/quartz_test
#org.quartz.dataSource.qzDS.user:root
#org.quartz.dataSource.qzDS.password:root
#org.quartz.dataSource.qzDS.maxConnection:10