对于前几篇文章中总结的项目,中间使用到的各项技术都有描述,接下去就需要把项目整合发布了,由于该项目不需要前台展示所以当时直接采用了普通的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定时任务或者与项目更加匹配。
对于以上内容如有错误烦请留言斧正,达到一起进步的效果,谢谢
分享到:
相关推荐
Spring使用timer定时器-能精确几点运行定时任务的小demo
C语言02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序(STC32G-DEMO-CODE-220311kw)C语言02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序(STC32G-DEMO-CODE-220311kw)C语言02-Timer0-Timer1-Timer2-Timer3-Timer4...
java定时器,timer类操作详解 java定时器,timer类操作详解
java Timer定时器实例 Spring实例.doc java Timer定时器实例 Spring实例.doc
12-2-1-定时器 Timer-相关例程演示 12-2-2-定时器 Timer-特性及时钟 12-2-3-定时器 Timer-模式
java 定时器(Timer) java 定时器(Timer) java 定时器(Timer)
java_Timer定时器实例_Spring实例
spring定时器Spring定时器的两种实现方式Java的Timer类和OpenSymphony的Quartz。
我们通常写的timer都是用main方法写的定时器,但同样我们也需要根据服务器启动后定时器也启动的 定时执行任务。不过有个致命伤就是集群方面跟quartz不能比,此方法代码做参考不错,如果要用,那么这个方法在一台...
Java定时器Timer简述.pdf
java定时任务调度Timer简单示例代码 ,
1.这节是在定时器中断里面控制gpio翻转 3. 用ESP8266+android,制作 4. ESP8266刷AT固件与node 5. 有人WIFI模块使用详
使用spring实现定时任务,整合spring,springmvc,实现定时任务执行
在Spring中使用Timer --实现由时间触发的事件任务.doc在Spring中使用Timer --实现由时间触发的事件任务.doc在Spring中使用Timer --实现由时间触发的事件任务.doc在Spring中使用Timer --实现由时间触发的事件任务.doc
Spring两种定时器实例配置:Java的TimerTask类和OpenSymphony的Quartz。包含5种配置方式:timer普通定时器、timer特定方法定时器、quartz简单定时器、quartz精确定时器、quartz特定方法定时器。简单实用,一看就会。
自己写的java timer控件定时器详解(附详细代码),已通过调试并运行。
spring定时器Timer.rarspring定时器Timer.rarspring定时器Timer.rarspring定时器Timer.rarspring定时器Timer.rarspring定时器Timer.rar
在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。 对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。
Swift-定时器scheduledTimer