1. 定义job details
public class NotifyJobProcessor extends JobProcessor { private static final Log LOG = LogFactory.getLog(NotifyJobProcessor.class); public NotifyJobProcessor() { } @Override public void execute(JobExecutionContext context) throws JobExecutionException { String jobName = UploadType.NOTIFY.name(); LOG.debug("%s Job is running ......", jobName); Channel channel = getChannelFromContext(context); try { if (channel != null && channel.isWritable()) { UploadHeartbeat heartbeat = new UploadHeartbeat(UploadType.NOTIFY); UploadFunction notifyFunction = new UploadFunction(heartbeat); UploadFrame frame = new UploadFrame(notifyFunction); channel.writeAndFlush(frame); return; } } catch (Exception e) { LOG.error("Send %s Message failed !!!", jobName); e.printStackTrace(); } LOG.info("Channel is not active or null for %s Job, not need run it any more.", jobName); // channel is not active, then disable trigger disableTrigger(jobName); } }
jobprocessor定义:
public abstract class JobProcessor implements Job { private static final Log LOG = LogFactory.getLog(JobProcessor.class); protected Channel getChannelFromContext(JobExecutionContext context) { Channel channel = null; try { Scheduler schedule = context.getScheduler(); SchedulerContext scheduleContext = schedule.getContext(); channel = (Channel) scheduleContext.get("channel"); } catch (SchedulerException e) { LOG.error("get Channel in Job Execution Context failed !!!", e); e.printStackTrace(); } return channel; } protected void disableTrigger(String jobName) { try { LOG.info("Going to remove %s Job", jobName); UploadJobManager.getInstance().unTrigger(jobName); } catch (SchedulerException e) { LOG.error("Untrigger %s Job failed !!!", jobName); e.printStackTrace(); } } }
2. 配置job details
<!-- For times when you need more complex processing, passing data to the scheduled job --> <bean name="notify.job.processor.detail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="com.eifesun.monitor.upload.uploader.processor.NotifyJobProcessor" /> <property name="durability" value="true" /> </bean>
3.配置job trigger
变量
<bean id="heartbeatSecond" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject" ref="upload.setting"/> <property name="targetMethod" value="getSendHeartBeatSecond"/> </bean>
trigger
<bean id="notify.job.processor.trigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <property name="jobDetail" ref="notify.job.processor.detail" /> <property name="startDelay" value="5" /> <property name="repeatInterval" value="#{heartbeatSecond}" /> </bean>
4.配置job scheduler
<bean id="job.processor.scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="autoStartup" value="false"/> <property name="jobDetails"> <list> <ref bean="notify.job.processor.detail" /> </list> </property> <property name="triggers"> <list> <ref bean="notify.job.processor.trigger" /> </list> </property> </bean>
最后,
如果job中有外部依赖,可以这样配置
<bean name="report.job.processor.detail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="com.eifesun.monitor.upload.uploader.processor.ReportJobProcessor" /> <property name="jobDataMap"> <map> <entry key="inverterRepo" value-ref="inverter.repo" /> <entry key="deviceRepo" value-ref="device.repo" /> </map> </property> <property name="durability" value="true" /> </bean>