2
我在使用主题中的配置实现故障转移时遇到问题。我有一个配置在石英(2.1.7)集群中的弹簧批处理作业。在配置文件中,我已经设置requestsRecovery = true
,和我的石英配置文件是这样的:使用弹簧配置石英故障转移
org.quartz.scheduler.instanceId=AUTO
org.quartz.scheduler.instanceName = quartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
org.quartz.jobStore.useProperties=true
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.tablePrefix = QRPC_
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.scheduler.jmx.export=true
org.quartz.jobStore.clusterCheckinInterval = 20000
我的Spring配置如下:
<context:component-scan base-package="it.myproject.scheduler" />
<bean name="myJob" class="it.myproject.scheduler.CustomJobDetailFactoryBean">
<property name="jobClass" value="it.myproject.scheduler.SellJob" />
<property name="requestsRecovery" value="true" />
<property name="durability" value="true"/>
</bean>
<bean id="cronTrigger" class="it.myproject.scheduler.CustomCronTriggerFactoryBean">
<property name="jobDetail" ref="myJob"/>
<property name="cronExpression" value="${sched.expression}"/>
</bean>
<bean id="quartzScheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="myJob" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
<property name="dataSource" ref="myDataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="schedulerName" value="quartzScheduler"/>
<property name="configLocation" value="file:///quartz.properties" />
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<property name="overwriteExistingJobs" value="true"/>
<property name="autoStartup" value="true" />
<property name="jobFactory">
<bean class="it.myproject.scheduler.AutowiringSpringBeanJobFactory"/>
</property>
</bean>
工作代码:
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.JobDetailAwareTrigger;
public class CustomCronTriggerFactoryBean extends CronTriggerFactoryBean {
@Override
public void afterPropertiesSet() {
super.afterPropertiesSet();
// Remove the JobDetail element
getJobDataMap().remove(JobDetailAwareTrigger.JOB_DETAIL_KEY);
}
}
public class CustomJobDetailFactoryBean extends JobDetailFactoryBean {
private boolean requestsRecovery;
public CustomJobDetailFactoryBean() {
super();
}
@Override
public void afterPropertiesSet() {
super.afterPropertiesSet();
JobDetailImpl jobDetail = (JobDetailImpl) getObject();
jobDetail.setRequestsRecovery(isRequestsRecovery());
}
public boolean isRequestsRecovery() {
return requestsRecovery;
}
public void setRequestsRecovery(boolean requestsRecovery) {
this.requestsRecovery = requestsRecovery;
}
}
public class myJob extends QuartzJobBean {
@Autowired
private MyScheduler task;
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
task.runJob();
}
}
我有在tomcat上的两个独立的机器上部署我的应用程序。并发性工作正常,当我启动服务器时,只有一个实例获取锁并且可以工作,但是如果我停止获取该锁的计算机,则第二台计算机不会进行故障切换。如果我仅使用一台服务器,则可以观察到相同的结果,并停止并重新启动不会进行故障转移。 在表job detail
列requests_recovery
设置为1.任何人都可以帮助我吗?