scheduler的Spring配置如下:
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="cronTriggerA"/>
<ref local="cronTriggerB"/>
</list>
</property>
<property name="startupDelay" value="60" />
<property name="schedulerContextAsMap">
<map>
<entry key="timeout" value="30" />
</map>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">20</prop>
</props>
</property>
</bean>
其中cronTriggerA任务会通过Hibernate访问数据源dataSourceA,cronTriggerB任务会通过Hibernate访问数据源dataSourceB,cronTriggerA任务始终正常执行,但是cronTriggerB任务每次启动工程之后只执行4次并且每次固定都是执行4次,然后就不再执行,我将A任务去掉只保留B任务,问题依旧,我把B任务中通过Hibernate访问数据库的代码去掉,就没有问题了(仅保留查询数据库的代码也问题依旧),看来问题在访问数据库的地方,但是始终找不到根本原因,也没解决问题,求助各位达人~~
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="cronTriggerA"/>
<ref local="cronTriggerB"/>
</list>
</property>
<property name="startupDelay" value="60" />
<property name="schedulerContextAsMap">
<map>
<entry key="timeout" value="30" />
</map>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">20</prop>
</props>
</property>
</bean>
其中cronTriggerA任务会通过Hibernate访问数据源dataSourceA,cronTriggerB任务会通过Hibernate访问数据源dataSourceB,cronTriggerA任务始终正常执行,但是cronTriggerB任务每次启动工程之后只执行4次并且每次固定都是执行4次,然后就不再执行,我将A任务去掉只保留B任务,问题依旧,我把B任务中通过Hibernate访问数据库的代码去掉,就没有问题了(仅保留查询数据库的代码也问题依旧),看来问题在访问数据库的地方,但是始终找不到根本原因,也没解决问题,求助各位达人~~
当执行到不动的时候查看一下你的空用户的连接数.如果连接数达到超过你连接池或hibernate配置的最大连接数,那肯定是某些session打开了没释放.
问题不是执行到不动,而是每次执行都执行完了,但是4次执行之后,就不再执行,任务方法第一行打日志的都不执行
<bean id="jobDetailB"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jobServiceB" />
<property name="targetMethod" value="job" />
<property name="concurrent" value="false" />
</bean><bean id="cronTriggerB"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetailB" />
<property name="cronExpression" value="0/30 * * * * ?" /><!-- 每30秒 -->
</bean>现在的问题是jobServiceB的job()方法,前4次都全部执行完毕,正常,但在执行4次之后连第一行代码都不再执行
你把访问数据库的代码替换成Thread.sleep(n),这个n设得足够大,看看是不是照样执行4次就挂掉了,如果不是,很可能和你的数据库有关.
居然是因为我查询mysql数据库是分页查询,我改成一次性查询出所有要的数据,就没问题了!这个也太扯了!
改成一次性查询并不是根本解决之道,还好我这个业务一次性查数据量也不大,万一什么时候碰到一个数据量很大必须分页查的功能,岂不是玩完了?
分页查询为什么会导致多次执行之后quartz任务会中止呢?