我使用石英调度程序来安排弹出批处理作业。 应用程序启动时没有任何异常,但它永远不会触发任何工作。
让我解释一下我的情景:
如果我使用MapJobRepositoryFactoryBean
通过main方法运行作业(使用调度程序),它可以正常工作,但在将调度程序与spring-mvc Web应用程序集成后,它会显示一些版本更新错误,之后我使用& #34; JobRepositoryFactoryBean"它使用数据库存储作业状态。
所以我添加了JobRepositoryFactoryBean
bean和其他DB
更改,但它永远不会触发这项工作。
bellow是一个日志片段
2015-02-10 19:14:45 INFO context.support.XmlWebApplicationContext - Bean 'jobRegistry' of type [class org.springframework.batch.core.configuration.support.MapJobRegistry] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2015-02-10 19:14:45 INFO jdbc.datasource.DriverManagerDataSource - Loaded JDBC driver: com.mysql.jdbc.Driver
2015-02-10 19:14:45 INFO launch.support.SimpleJobLauncher - No TaskExecutor has been set, defaulting to synchronous executor.
2015-02-10 19:14:46 INFO context.support.DefaultLifecycleProcessor - Starting beans in phase 2147483647
2015-02-10 19:14:46 INFO scheduling.quartz.SchedulerFactoryBean - Starting Quartz Scheduler now
2015-02-10 19:14:46 INFO web.servlet.DispatcherServlet - FrameworkServlet 'mvc-dispatcher': initialization completed in 2155 ms
这是我的工作配置
<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
<bean
class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
<property name="jobRegistry" ref="jobRegistry" />
</bean>
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"
p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager">
<property name="databaseType" value="reconConfig!{batch.databaseType}" />
<property name="isolationLevelForCreate" value="ISOLATION_DEFAULT" />
</bean>
<bean id="mapJobRepository"
class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"
lazy-init="true" autowire-candidate="false" />
<bean id="jobOperator"
class="org.springframework.batch.core.launch.support.SimpleJobOperator"
p:jobLauncher-ref="jobLauncher" p:jobExplorer-ref="jobExplorer"
p:jobRepository-ref="jobRepository" p:jobRegistry-ref="jobRegistry" />
<bean id="jobExplorer"
class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean"
p:dataSource-ref="dataSource" />
<bean id="jobRegistry"
class="org.springframework.batch.core.configuration.support.MapJobRegistry" />
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="appDataSource" />
</bean>
<bean class="org.springframework.batch.core.scope.StepScope" />
<bean id="reconConfigPlaceholderProperties"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="location" value="classpath:batchDb.properties" />
<property name="placeholderPrefix" value="reconConfig!{" />
<property name="placeholderSuffix" value="}" />
</bean>
</beans>
它运行成功,但经过一些更多的开发后它停止了工作。我无法弄清楚我在配置中究竟发生了什么变化导致了这种情况。
任何人都可以使用&#34; JobRepositoryFactoryBean&#34;建议检查点,如果我遗失或问题出在其他地方。
答案 0 :(得分:0)
如果这是您作业调度的整个配置,我相信您完全错过了Cron调度部分......
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<property name="cronExpression" value="*/10 * * * * ?" />
</bean>
</property>
</bean>
请仔细阅读spring doc和quartz scheduling section here.
答案 1 :(得分:0)
我们遇到过类似或相同的问题。查看DB存储库。存储库不能抵抗应用服务器的不同实例(例如测试和开发环境)。这意味着,当两个或多个应用程序连接到同一个DB时,您可能会遇到问题。应用程序开始占用时间和工作。一个应用程序中的未注册作业被签名为ERROR并被阻止,反之亦然。 在这种情况下,两个表很重要。 选择XXX_SCHEDULER_STATE。有不止一排?比可能有冲突。 (您是否无法区分您的APP服务器?如果是,您将连接到另一个数据库,而不是您想象的。这通常是一个微不足道的问题。)
选择XXX_TRIGGERS.TRIGGER_STATE有ERROR吗?如果是,请尝试从任何SQL工具更改它:
update TRIGGERS set TRIGGER_STATE = 'WATING' where TRIGGER_STATE = 'ERROR';
重启应用服务器。如果运气好的话,失败的触发器会在重启后启动并运行。如果没有,请尝试关闭并发App Server或更改存储库。