`
fred_张浩
  • 浏览: 31141 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

小码农的代码(四)----------JAVA中Timer定时器与Spring定时任务

阅读更多
对于前几篇文章中总结的项目,中间使用到的各项技术都有描述,接下去就需要把项目整合发布了,由于该项目不需要前台展示所以当时直接采用了普通的Main工程。既然不是交给容器托管就需要自己启动线程使得项目能够在线上一直运行,因此考虑到需要使用到线程,又由于是需要定时去同步数据,则直接使用了Java中的Timer定时功能。
对于Timer通过查阅JDK可以了解到它有一个schedule方法,而该方法的其中一个参数是需要TimerTask抽象类,而该类是实现Runnable接口,这样该功能实现的思路就出来了。接下去进入编码阶段
首先实例化Timer对象
Timer timer = new Timer();
然后实例化TimerTask,
TimerTask timerTask = new TimerTask() {
			
			@Override
			public void run() {
				System.out.println("调用了timer定时任务"+new Date());
				//输入业务代码
			}
		};
最后timer调用schedule方法
timer.schedule(timerTask, 20,20);
这样就结束了。
做完之后考虑到项目既然已经使用了Spring,为何不直接使用Spring的定时任务呢?于是就自己对其进行了整改:
通过查阅资料了解到Spring的定时任务从实现上来区分主要分为TimerTask与Quartz来实现。由于原先使用的就是TimerTask自然就直接用TimerTask了结果是悲剧的,由于本人项目中使用的是Spring4,发现在Spring4中已经取消了org.springframework.scheduling.timer.ScheduledTimerTask这个类,自然这个实现方式已经不适用了,继而掉头使用Quartz来实现。
首先新建一个定时任务Job类
public class BaseQuartzDemo {
	@Autowired
	private UserService userService;

	public void addUserForQuartz() {
		System.out.println("定时器调用quartz..." + new Date());
		userService.saveUser(null);
	}
}
然后对这个类需要定时的方法进行配置注入
<bean id="baseQuartzDemo" class="com.zh.demo.base.task.BaseQuartzDemo"></bean>
	<bean id="timeDitail"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="baseQuartzDemo"></property>
		<property name="targetMethod" value="addUserForQuartz"></property>
	</bean>
接下去就是定义触发时间与频度了,这里需要注意点使用的quartz的版本问题,本人是使用Quartz2.x所以需要使用CronTriggerFactoryBean,如果是使用之前版本,可以使用CronTriggerBean
<bean id="timeTigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail" ref="timeDitail"></property>
		<property name="cronExpression">
			<value>0/2 * * * * ?</value>
		</property>
	</bean>
最后启动这个定时任务这里需要注意由于quartz会使用数据库记录job的状态而进行维护,若未建立相关数据表则加入autowire="no",否则autowire会自动装配dateSource导致缺表报错,如果建表保存Quartz的日志信息可以忽略这一点
<bean autowire="no"  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="timeTigger" />
			</list>
		</property>
	</bean>

进行代码测试,可以通过Main方法直接测试,也可以放入Tomcat容器测试,附上Main方法测试的代码吧
public class MainDemoTest {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "applicationContext03.xml" });
		UserService userService = (UserService)context.getBean("userService");
		userService.init();
	}
}

测试结果是定时任务正常运行。具体例子以及其他简单代码可以下载附件。
ps:这个项目涉及到的技术功能点差不多结束了,期间最大的感触就是写代码之前必须要先想清楚,比如定时就是一个例子,直接使用Spring定时任务或者与项目更加匹配。
对于以上内容如有错误烦请留言斧正,达到一起进步的效果,谢谢
2
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics