Java 中兑现定时服务 在ssh框架中跟普通工程里面创建的方式,区别
Java 中实现定时服务 在ssh框架中跟普通工程里面创建的方式,区别
闲话不多说 直接看下面代码
网上这么说的:
1、 Spring中使用TimerTask定制任务
(1)、TimerTask实现了Runnable接口,待执行的任务置于run()中。Timer是一个安排TimerTask的类 此两者一般一起工作。应用时首先创建一个TimerTask的对象,然后用一个Timer的类的schedule方法安排执行它。
(2)、Spring提供了ScheduledTimerTask,就是通常所说的任务,把配置好的任务(ScheduledTimerTask)注册到调度器TimerFactoryBean中就可以了。实际上ScheduledTimerTask是对JDK中的TimerTask进行了封装,TimerFactoryBean是对JDK中的Timer进行了封装。
(3)开发使用中Spring配置文件的说明
1、编写NewTimeTask.java,此类需extends TimerTask类,在run方法中编写要执行的操作
2、Spring配置文件
<beans>
<!-- 自己编写的任务类 -->
<bean id="newTask" class="com.huawei.esop.task.NewTimeTask"></bean>
<bean id="newsScheduledTask"
class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!-- 系统启动后60秒开始执行 单位毫秒-->
<property name="delay" value="60000"></property>
<!-- 每60秒执行一次 -->
<property name="period" value="60000"></property>
<!-- 执行的任务 -->
<property name="timerTask" ref="newTask"></property>
</bean>
<!-- 注册调度器 -->
<bean id="timerFactory"
class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="newsScheduledTask" />
</list>
</property>
</bean>
</beans>
上面这段说发 这就类似我下面的这个创建方式
一 创建timerManager 管理类。
二 创建本地要执行的任务类方法
三 在web.xml中配置监听器
第一种方式到这里算结束了 。下面看第二种
网上的第二中说发。
1、 既然我们使用了Spring,所以不一定要extends TimerTask类来定义一个Task,Spring也可以使用MethodInvokingTimerTaskFactoryBean类直接指定执行某个对象的方法.
2、 MyTask.java 此类无需extends TimerTask类
public class MyTask
{
public void execute()
{
System.out.println("开始我的任务");
//编写逻辑代码
}
}
applicationcontext.xml
<bean id="myTask" class="com.huawei.esop.MyTask" />
<!-- 定义任务对象和方法 -->
<bean id="timerTaksBean"
class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="myTask"></property>
<property name="targetMethod" value="execute"></property>
</bean>
<!-- 任务的执行 -->
<bean id="scheduledTimerTask"
class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask" ref="timerTaksBean"></property>
<property name="period" value="1000"></property>
<property name="delay" value="1000"></property>
</bean>
<!-- 注册任务 -->
<bean id="timerFactoryBean"
class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduledTimerTask" />
</list>
</property>
</bean>
我下面同样给出例子。
applicationContext.xml beans中添加如下代码 class 做相应配置
二 要执行的定时方法类 不要继承(extends) TimerTask 类 这也是跟第一种方式不同之处
三 把你在web.xml中的定时服务类的监听器配置注释或删掉
个人觉得第二种更方便更好看看看看些
闲话不多说 直接看下面代码
引用
网上这么说的:
1、 Spring中使用TimerTask定制任务
(1)、TimerTask实现了Runnable接口,待执行的任务置于run()中。Timer是一个安排TimerTask的类 此两者一般一起工作。应用时首先创建一个TimerTask的对象,然后用一个Timer的类的schedule方法安排执行它。
(2)、Spring提供了ScheduledTimerTask,就是通常所说的任务,把配置好的任务(ScheduledTimerTask)注册到调度器TimerFactoryBean中就可以了。实际上ScheduledTimerTask是对JDK中的TimerTask进行了封装,TimerFactoryBean是对JDK中的Timer进行了封装。
(3)开发使用中Spring配置文件的说明
1、编写NewTimeTask.java,此类需extends TimerTask类,在run方法中编写要执行的操作
2、Spring配置文件
<beans>
<!-- 自己编写的任务类 -->
<bean id="newTask" class="com.huawei.esop.task.NewTimeTask"></bean>
<bean id="newsScheduledTask"
class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!-- 系统启动后60秒开始执行 单位毫秒-->
<property name="delay" value="60000"></property>
<!-- 每60秒执行一次 -->
<property name="period" value="60000"></property>
<!-- 执行的任务 -->
<property name="timerTask" ref="newTask"></property>
</bean>
<!-- 注册调度器 -->
<bean id="timerFactory"
class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="newsScheduledTask" />
</list>
</property>
</bean>
</beans>
上面这段说发 这就类似我下面的这个创建方式
一 创建timerManager 管理类。
import java.util.Timer; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.commons.lang.time.DateUtils; public class timerManager implements ServletContextListener { //每天的毫秒数 public static final long PERIOD_DAY = DateUtils.MILLIS_IN_DAY; //一周的毫秒数 public static final long PERIOD_WEEK = PERIOD_DAY * 7; //无延迟 public static final long NO_DELAY = 0; //定时器 private Timer timer; /** * 在Web应用结束时停止任务 */ public void contextDestroyed(ServletContextEvent sce) { timer.cancel();//定时器销毁 } /** * 在Web应用启动时初始化任务 */ public void contextInitialized(ServletContextEvent sce) { //定义定时器 timer = new Timer(true); //timer.schedule(new LocationTask(), NO_DELAY, PERIOD_WEEK * 4); // timer.schedule(new figureTermCount(), NO_DELAY, 30000); } }
二 创建本地要执行的任务类方法
import java.util.TimerTask; public class LocationTask extends TimerTask { private static boolean isRunning = false; @Override public void run() { if(!isRunning) { isRunning = true; //------要执行的程序块-------- isRunning = false; } else { //------要执行的程序块-------- } } }
三 在web.xml中配置监听器
<listener> <listener-class>com.sxy.sms.util.timerManager</listener-class> </listener>
第一种方式到这里算结束了 。下面看第二种
引用
网上的第二中说发。
1、 既然我们使用了Spring,所以不一定要extends TimerTask类来定义一个Task,Spring也可以使用MethodInvokingTimerTaskFactoryBean类直接指定执行某个对象的方法.
2、 MyTask.java 此类无需extends TimerTask类
public class MyTask
{
public void execute()
{
System.out.println("开始我的任务");
//编写逻辑代码
}
}
applicationcontext.xml
<bean id="myTask" class="com.huawei.esop.MyTask" />
<!-- 定义任务对象和方法 -->
<bean id="timerTaksBean"
class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="myTask"></property>
<property name="targetMethod" value="execute"></property>
</bean>
<!-- 任务的执行 -->
<bean id="scheduledTimerTask"
class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask" ref="timerTaksBean"></property>
<property name="period" value="1000"></property>
<property name="delay" value="1000"></property>
</bean>
<!-- 注册任务 -->
<bean id="timerFactoryBean"
class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduledTimerTask" />
</list>
</property>
</bean>
我下面同样给出例子。
applicationContext.xml beans中添加如下代码 class 做相应配置
<bean id="myTask" class="com.sxy.sms.task.figureTermCount" /> <!-- 定义任务对象和方法 --> <bean id="timerTaksBean" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean"> <property name="targetObject" ref="myTask"></property> <property name="targetMethod" value="execute"></property> </bean> <!-- 任务的执行 --> <bean id="scheduledTimerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="timerTask" ref="timerTaksBean"></property> <property name="period" value="1000"></property> <property name="delay" value="1000"></property> </bean> <!-- 注册任务 --> <bean id="timerFactoryBean" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref bean="scheduledTimerTask" /> </list> </property> </bean>
二 要执行的定时方法类 不要继承(extends) TimerTask 类 这也是跟第一种方式不同之处
public class figureTermCount { public void execute() { System.out.println("开始我的任务"); //编写逻辑代码 } }
三 把你在web.xml中的定时服务类的监听器配置注释或删掉
个人觉得第二种更方便更好看看看看些