论坛首页 Web前端技术论坛

Java 中实现定时服务 在ssh框架中跟普通工程里面创建的方式,区别

浏览 2637 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-01-11   最后修改:2012-02-29
闲话不多说 直接看下面代码

引用

网上这么说的:

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中的定时服务类的监听器配置注释或删掉


个人觉得第二种更方便更好看看看看些




论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics