亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

總結J2EE中使用任務調度三種方式

系統 1759 0

一.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.

?

?

?

總結J2EE中使用任務調度三種方式


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美日韩亚洲国内综合网香蕉 | 精品在线免费视频 | 亚洲热线99精品视频 | 国产免费观看a大片的网站 国产免费精彩视频 | 99热在这里只有精品 | 欧美一级毛片在线观看 | 天天操夜夜操天天操 | 日韩午夜在线观看 | 综合图色| 久久啊| 思思91精品国产综合在线 | 色天使色婷婷丁香久久综合 | 视频福利网 | 日本黄色录像视频 | 国产视频福利一区 | 狠狠色丁香久久婷婷 | 中文字幕第66页永久乱码 | 天天操人人爱 | 国产亚洲欧美另类一区二区三区 | 成人欧美一区二区三区黑人免费 | 久久久久欧美精品三级 | 91在线九色 | 国产精品美女久久久久网站 | 亚洲综合五月天 | 欧美日韩国产亚洲一区二区 | 天堂成人精品视频在线观 | 日本一级特黄aa毛片免费观看 | 第一福利在线观看永久视频 | 欧美性猛交xxxx免费看久久久 | 天天综合网天天做天天受 | 四虎精品免费国产成人 | 波多野结衣一区二区三区四区 | 久久久青草 | 九天玄帝诀王凡小说免费阅读 | 国产成人亚洲精品91专区手机 | 欧美日韩高清在线观看 | 天天躁夜夜躁狂狂躁综合 | 深夜福利在线免费观看 | 国产性色视频在线高清 | 日韩a一级欧美一级在线播放 | 四虎影视在线永久免费观看 |