`
zhouYunan2010
  • 浏览: 207646 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类

总结J2EE中使用任务调度三种方式

阅读更多

一.java.util.timer类(一般不用它)
首先在web.xml中配置listener监听器

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  
  <!-- 可以用来启动schelduledExcutorsService 或 timer -->   
    <listener>
  	<listener-class>com.timer.TimerListener</listener-class>
  </listener>
   
</web-app>
 

然后在com.timer包下创建TimerListener.java

package com.timer;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import com.scheldule.SchelduCall;

import java.util.*;


public class TimerListener implements ServletContextListener {
	private Timer timer;
	
	public TimerListener(){
		System.out.println("执行TimerListener构造函数");
	}
	
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("destory listener");
		timer.cancel();

	}

	
	public void contextInitialized(ServletContextEvent arg0) {
		System.out.println("init listener");
	    timer = new Timer();                //可以使用timer
		timer.schedule(new TopicTask(), 0, 20*1000);    //服务器启动时就执行一次
		new SchelduCall().scheldul();      //可以调用scheldul()方法
	
	}

}

 任务类:topicTask.java

package com.timer;

import java.util.*;

public class TopicTask extends TimerTask{

	public void run() {
		System.out.println("task:"+new Date());
	}

}

 然后启动服务器就能循环执行任务了。

 

 

 

二.使用类java.util.concurrent.ScheduledExecutorService;

首先建立SchedulCall.java

package com.scheldule;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class SchelduCall {
	private final ScheduledExecutorService scheduler = 
	       Executors.newScheduledThreadPool(1);
	
	public static void main(String[] args) throws Exception{
		new SchelduCall().scheldul();
	}
	
	public void  scheldul(){
		        final Runnable beeper = new Runnable() {
		                public void run() { System.out.println("beep"); }
		            };
		        final ScheduledFuture<?> beeperHandle = 
		            scheduler.scheduleAtFixedRate(beeper, 5, 7, TimeUnit.SECONDS);   //过五秒后开始执行,然后循环7秒执行一次
		        scheduler.schedule(new Runnable() {        //第27秒后执行
		                public void run() { 
		                	beeperHandle.cancel(true);
		                	System.out.println("stop");
		                }
		            }, 27, TimeUnit.SECONDS);
		        //scheduler.shutdown();
    }
		 
}
 

然后再TimerListener中调用即可

 

 

 

三.自然要属任务调度框架quartz

1.首先在web.xml文件中加入 如下内容(根据自己情况设定)

在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用,提供了一个QuartzInitializerServlet和一个QuartzInitializerListener,用于在加载web应用时,对quartz进行初始化。

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 使用监听器初始化quartz -->
  <!-- <context-param>
		<param-name>config-file</param-name>
		<param-value>/quartz.properties</param-value>
	</context-param>
	
	<context-param>
		<param-name>shutdown-on-unload</param-name>
		<param-value>true</param-value>
	</context-param>
	
	<listener>
		<listener-class>
			org.quartz.ee.servlet.QuartzInitializerListener
		</listener-class>
	</listener>
	 -->
	
	<!-- 在servlet中初始化 -->
	 
	<servlet>
         <servlet-name>
             QuartzInitializer
         </servlet-name>
         <servlet-class>
             org.quartz.ee.servlet.QuartzInitializerServlet
         </servlet-class>
         <init-param>
             <param-name>config-file</param-name>
             <param-value>/quartz.properties</param-value>
         </init-param>
         <init-param>
             <param-name>shutdown-on-unload</param-name>
             <param-value>true</param-value>
         </init-param>
         <load-on-startup>1</load-on-startup>
     </servlet>
   
</web-app>
 

2、quartz.properties文件的配置(各项属性说明下次写),内容如下:

上面提到了quartz.properties,这是自行指定的,Quartz提供了一个默认的配置文件,可以满足基本的j2se应用,如果在 web应用中,我们想把job,trigger配置都写到文件中,就需要自己来写,并指定在初始化时加载我们自己的quratz.properties, 位置放在classes下。

org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = one

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 2
org.quartz.threadPool.threadPriority = 4

org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = quartz_job.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true

 

3、 quartz_job.xml文件配置(各项属性说明下次写),内容如下:

quartz要使用插件来加载自己的xml配置文件,上面指定加载classes\quartz_job.xml文件。

我写了3个类Job

<?xml version="1.0" encoding="UTF-8"?>
<quartz>
<job>
    <job-detail>
      <name>listener3</name>
      <group>group1</group>
      <job-class>SimpleQuartzJob</job-class>
    </job-detail>
    
    <trigger>
      <cron>
        <name>hello3</name>
        <group>group1</group>
        <job-name>listener3</job-name>
        <job-group>group1</job-group>
        <cron-expression>0/1 * * * * ?</cron-expression>
     </cron>
    </trigger>
</job>

<job>
    <job-detail>
      <name>listener1</name>
      <group>group1</group>
      <job-class>com.web.config.Job1</job-class>

    </job-detail>
    <trigger>
      <cron>
        <name>hello</name>
        <group>group1</group>
        <job-name>listener1</job-name>
        <job-group>group1</job-group>
        <cron-expression>0/10 * * * * ?</cron-expression>
     </cron>
    </trigger>
</job>

<job>
    <job-detail>
      <name>listener2</name>
      <group>group2</group>
      <job-class>com.web.config.Job2</job-class>

    </job-detail>
    <trigger>
      <cron>
        <name>hello2</name>
        <group>group2</group>
        <job-name>listener2</job-name>
        <job-group>group2</job-group>
        <cron-expression>0/5 * * * * ?</cron-expression>
     </cron>
    </trigger>
</job>



</quartz>
 

 

给一个com.web.config下的Job1.java

package com.web.config;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class Job1 implements Job {

	public Job1() {

	}

	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		System.out.println("job1-" + new Date());
	}
}

 其他可以写自己的业务逻辑

 

还可以使用quartz包中的方法配置jobdetail,trigger

package com.quartz;

import java.util.Date;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;

/*
 * 使用类调用。直接运行
 * */
public class FirstDemo {
	public void run() throws SchedulerException{
		// 创建调度者工厂
		SchedulerFactory schedulerFactory = new StdSchedulerFactory();
		// 用工厂创建一个调度者
		Scheduler scheduler = schedulerFactory.getScheduler();
		// 利用 Quartz 提供的 getNextGivenSecondDate 返回一个当前时间四舍五入的 5 的倍数时间
		long ts = TriggerUtils.getNextGivenSecondDate(null, 5).getTime();
		// 创建一个工作,并命名为‘job1’,放入‘group1’组中,HellowWorl 是在此工作中需要执行的类
		JobDetail jobDetail = new JobDetail("job1","mygroup",HelloWorld.class);
		// 创建一个触发器,并命名为‘trigger1’,将此触发器设置在 ‘job1’ 上 ,并设置什么情况下启动
		SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1","job1", new Date(ts), null, -1, 1000L);
		// 将 ‘job1’ 加入调度者中,
		scheduler.scheduleJob(jobDetail, simpleTrigger);
		// 开始运行调度程序
		scheduler.start();
		// 停止调度程序
		// scheduler.shutdown(true);
	}
	
	public static void main(String[] args) throws SchedulerException {
		FirstDemo example = new FirstDemo();
		example.run();
	}
}
 

以上有些是拿着前辈的demo,我整合一下。前辈看到勿怪

 

最后给一个包含3种方式的demo.

 

 

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    毕业论文jsp597任务调度器的设计与实现.doc

    本文旨在设计和实现一个jsp597任务调度器,解决大型J2EE web应用中的任务调度问题。该系统旨在提供一个统一的任务调度标准,使得开发人员可以以指定的间隔时间执行各类操作,并完成一些无需用户输入的任务。 开发...

    Spring 任务调度

    【Spring 任务调度】是Spring框架中用于自动化执行任务的功能,它允许开发者安排任务在特定时间或间隔执行,无需用户交互。任务调度在许多场景下都非常有用,比如定期备份数据库、执行系统统计、检查新邮件等。 1. ...

    数据结构 J2ee JAVA知识点总结

    - 队列:先进先出(FIFO)的数据结构,适用于任务调度、打印队列等。 - 树:分层的数据结构,如二叉树、平衡二叉树(AVL树、红黑树)、B树等,常用于文件系统、数据库索引。 - 图:节点与节点间存在边的数据结构...

    J2ee 3D手机游戏开发开发详解

    在本文中,我们将深入探讨使用J2EE技术进行3D手机游戏开发的各个方面。J2EE(Java 2 Platform, Enterprise Edition)是一个用于构建企业级应用程序的平台,但它的潜力并不仅限于此,它同样可以用于开发具有复杂图形...

    基于j2ee的网上订餐系统的实现与设计

    《基于J2EE的网上订餐系统实现与设计》是一个典型的Web应用开发项目,它采用Struts、Spring和Hibernate这三大框架构建,旨在提供一种便捷的在线订餐服务。这个系统的设计与实现涵盖了多个IT领域的关键知识点,下面将...

    J2EE Patterns

    这些模式由John Crupi、Dan Malks和Deepak Alur等专家共同总结提炼,覆盖了J2EE体系架构的三个主要层级:表示层、业务层和集成层。 #### 表示层模式 - **拦截过滤器**(Intercepting Filter):用于处理请求和响应...

    分布式调度框架quartz从入门到精通

    使用Quartz进行任务调度,首先要定义任务(Job)。每个任务需要实现`org.quartz.Job`接口并覆盖`execute()`方法。JobDetail用于封装具体的Job实例以及调度策略。例如,可以使用JobBuilder来构建JobDetail: ```java...

    J2EE系统设计方案.doc

    7. **任务调度**:如Quartz或Spring Task,用于定期执行后台任务。 8. **Ajax技术**:增强用户体验,实现页面部分更新,减少网络请求。 **四、系统缓存** 1. **一般缓存策略**:采用内存缓存、分布式缓存等方式...

    (J2EE税务稽核系统)

    总结来说,J2EE税务稽核系统是利用J2EE技术栈构建的企业级应用,它结合了Struts1的Web控制、Hibernate的数据持久化和Spring的全面管理,形成了一套完整的解决方案。通过这样的系统,税务部门能够更加高效地执行稽核...

    【SpringBoot】廿五、SpringBoot中使用Quartz管理定时任务.pdf

    总结,SpringBoot结合Quartz库为开发者提供了一种强大且灵活的定时任务管理方式。通过引入必要的依赖、创建数据库表、定义实体类和任务类,以及配置Quartz,开发者可以轻松地创建、调度和管理定时任务,提高系统的...

    J2EE应用性能调优.docx

    总结,J2EE应用性能调优是一个综合性的工程,涉及到硬件、网络、操作系统、J2EE容器、后台服务、前端以及JVM等多个层面的优化。每个层面的优化都有其独特的方法和策略,需要结合实际情况灵活运用,以实现整体性能的...

    用 quartz 调度定时工作

    ### 使用 Quartz 进行定时任务调度 #### 一、Quartz 概述 Quartz 是 OpenSymphony 项目中的一个子项目,它提供了一套强大的调度功能,可以在 J2EE 环境下或者独立环境中运行。Quartz 的设计目标是成为一个全能型的...

    基于J2EE平台在线银行系统的实现.rar

    4. JMS:实现异步通信,例如银行系统的后台任务调度、消息通知等。 四、系统架构 典型的J2EE银行系统架构可能包含以下层次: 1. 客户端:用户通过Web浏览器访问系统。 2. Web层:负责用户界面展示,由Servlet和JSP...

    J2EE核心模式

    《J2EE核心模式》是一本深入探讨Java企业级应用开发的经典著作,它总结了在J2EE平台上构建可扩展、可维护、高效率应用程序的最佳实践。这些模式是基于大量实际开发经验提炼出来的,旨在帮助开发者理解并有效地解决在...

    BEA WebLogic平台下J2EE调优攻略

    创建新的执行队列,以实现更细粒度的任务调度。 #### 数据库调优 针对Oracle数据库的优化,不仅涉及SQL语句的优化,还包括数据库参数的微调,如调整缓存大小、索引结构等,以提高数据检索速度和减少磁盘IO。 ####...

    定时执行任务例子 绝对好用

    为了获取每天执行任务的具体时间,示例中使用了`ConfigurationFile`类来读取配置文件的内容。这可能是一个自定义的类,用于处理配置文件的读取和解析。在实际项目中,可以使用Apache Commons Configurations库或者...

    学习交流J2EE架构技术

    J2EE架构技术是针对企业级应用软件开发的一种复杂而综合的技术框架。随着21世纪的到来,软件开发环境发生了显著变化,从简单的桌面应用转向了需要网络支持、多用户协作、数据共享和高度集成的系统。企业级应用软件如...

    J2EE系统设计方案(1).doc

    7. **任务调度**:如Quartz,用于定时任务的执行。 8. **Ajax技术**:增强Web应用的交互性,实现局部刷新。 **系统缓存** 1. **一般缓存策略**:通过内存缓存提高数据读取速度,减少数据库压力。 2. **Hibernate二...

    【SpringBoot】廿五、SpringBoot中使用Quartz管理定时任务.docx

    【SpringBoot】廿五、SpringBoot中使用Quartz管理定时任务 定时任务是软件系统中不可或缺的一部分,它们常用于执行一些周期性的后台操作,比如数据备份、定时推送、定时统计等。SpringBoot作为轻量级的Java开发框架...

Global site tag (gtag.js) - Google Analytics