在在使用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无法启动。