在在使用Spring框架的时候,想在程序的后台自动开启一个线程去操作数据库,最开始使用了监听器,在程序一启动的时候就去开启一个线程,在线程中去操作数据库,最后发现,操作数据库的类似通过Spring注解进去的,该类的对象始终是NULL,分析发现该线程没有通过Spring就启动了,对应的类没有实例化。由于时间紧,最终放弃了多线程,而采用了Spring和quartz去实现定时任务。具体的配置入下。
找到Spring的配置文件applicationContext.xml,在该文件中加入下面的代码:
<bean id="executor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="100" />
<property name="queueCapacity" value="500" />
</bean>
<bean id="bizObject" class="cn.ccb.yn.acms.common.util.ShortMsgUtil" />
<bean id="jobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="bizObject" />
<property name="targetMethod" value="getSms" />
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<property name="cronExpression" value="10 0/1 * * * ?" />
</bean>
<bean id="taskTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<property name="startDelay" value="10000" />
<property name="repeatInterval" value="30000" />
</bean>
<!-- 设置调度 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
<property name="taskExecutor" ref="executor" />
</bean>对上面文件中的几个bean给出说明:
executor是Spring线程池对象,其中可以配置线程池的大小等参数
bizObject是后台处理逻辑的java类
jobDetail是配置java类和对应方法的的bean
taskTrigger配置定时任务执行的时间
需要使用到下面的jar包:
quartz-1.8.5.jar;slf4j-api-1.7.5.jar;slf4j-log4j12-1.7.5-sources.jar;
后2个包去slf4j官网上下载slf4j-1.7.5.zip包,解压后,就会有上面的后2个包,这2个包的版本必须一致,否则tomcat无法启动。




