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>