在Web应用中使用Quartz

Quartz也常用在Web应用中,常见的是交由Spring托管的形式,但这里并非介绍这个。这里介绍Quartz在Web应用中单独使用。

一般来说,Web应用启动时,应注册已经确定的定时任务;一些动态的、未确定触发时间的定时任务,后续可通过静态的Scheduler注册。

这里使用监听器在应用启动时注册,记得在web.xml注册这个监听器哦;在关闭Web应用时,也要相应的注销定时任务。

其他配置文件、Java类与上例子相同,这里只是注册定时任务的地方换成此监听器了。package com.anson.listener;

import com.anson.example1.HelloJob;

import org.quartz.*;

import org.quartz.impl.StdSchedulerFactory;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import javax.servlet.ServletContextEvent;

import javax.servlet.ServletContextListener;

/**

* 自定义一个应用监听器

*/

public class ApplicationContextListener implements ServletContextListener {

private Logger logger = LoggerFactory.getLogger(this.getClass());

public static Scheduler scheduler = null;

@Override

public void contextInitialized(ServletContextEvent servletContextEvent) {

this.logger.info("Web应用开始...");

/* 注册定时任务 */

try {

// 获取Scheduler实例

scheduler = StdSchedulerFactory.getDefaultScheduler();

scheduler.start();

// 具体任务

JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();

// 触发时间点

SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule()

.withIntervalInSeconds(5).repeatForever();

Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")

.startNow().withSchedule(simpleScheduleBuilder).build();

// 交由Scheduler安排触发

scheduler.scheduleJob(job, trigger);

this.logger.info("调度器开始注册:The scheduler register...");

} catch (SchedulerException se) {

logger.error(se.getMessage(), se);

}

}

@Override

public void contextDestroyed(ServletContextEvent servletContextEvent) {

this.logger.info("Web应用停止...");

/* 注销定时任务 */

try {

// 关闭Scheduler

scheduler.shutdown();

this.logger.info("调度器已关闭:The scheduler shutdown...");

} catch (SchedulerException se) {

logger.error(se.getMessage(), se);

}

}

}

web.xml<?xml  version="1.0" encoding="UTF-8"?>

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

version="3.1">

com.anson.listener.ApplicationContextListener

把Web项目在Tomcat中运行测试[INFO] 09 九月 06:19:56.121 下午 RMI TCP Connection(2)-127.0.0.1 [com.anson.listener.ApplicationContextListener]

Web应用开始...

[INFO] 09 九月 06:19:56.146 下午 RMI TCP Connection(2)-127.0.0.1 [org.quartz.impl.StdSchedulerFactory]

Using default implementation for ThreadExecutor

[INFO] 09 九月 06:19:56.160 下午 RMI TCP Connection(2)-127.0.0.1 [org.quartz.core.SchedulerSignalerImpl]

Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl

[INFO] 09 九月 06:19:56.161 下午 RMI TCP Connection(2)-127.0.0.1 [org.quartz.core.QuartzScheduler]

Quartz Scheduler v.2.2.3 created.

[INFO] 09 九月 06:19:56.161 下午 RMI TCP Connection(2)-127.0.0.1 [org.quartz.simpl.RAMJobStore]

RAMJobStore initialized.

[INFO] 09 九月 06:19:56.162 下午 RMI TCP Connection(2)-127.0.0.1 [org.quartz.core.QuartzScheduler]

Scheduler meta-data: Quartz Scheduler (v2.2.3) 'MyScheduler' with instanceId 'NON_CLUSTERED'

Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.

NOT STARTED.

Currently in standby mode.

Number of jobs executed: 0

Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 3 threads.

Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

[INFO] 09 九月 06:19:56.162 下午 RMI TCP Connection(2)-127.0.0.1 [org.quartz.impl.StdSchedulerFactory]

Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'

[INFO] 09 九月 06:19:56.162 下午 RMI TCP Connection(2)-127.0.0.1 [org.quartz.impl.StdSchedulerFactory]

Quartz scheduler version: 2.2.3

[INFO] 09 九月 06:19:56.162 下午 RMI TCP Connection(2)-127.0.0.1 [org.quartz.core.QuartzScheduler]

Scheduler MyScheduler_$_NON_CLUSTERED started.

[INFO] 09 九月 06:19:56.168 下午 RMI TCP Connection(2)-127.0.0.1 [com.anson.listener.ApplicationContextListener]

调度器开始注册:The scheduler register...

Hello Job

[DEBUG] 09 九月 06:19:56.177 下午 MyScheduler_Worker-1 [com.anson.example1.HelloJob]

com.anson.example1.HelloJob trigger...

[2017-09-09 06:19:56,206] Artifact quartz_example:war exploded: Artifact is deployed successfully

[2017-09-09 06:19:56,206] Artifact quartz_example:war exploded: Deploy took 643 milliseconds

Hello Job

[DEBUG] 09 九月 06:20:01.168 下午 MyScheduler_Worker-2 [com.anson.example1.HelloJob]

com.anson.example1.HelloJob trigger...

09-Sep-2017 18:20:05.276 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/Users/liurenkui/myLibrary/apache-tomcat-8.5.15/webapps/manager]

09-Sep-2017 18:20:05.305 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/Users/liurenkui/myLibrary/apache-tomcat-8.5.15/webapps/manager] has finished in [28] ms

Hello Job

[DEBUG] 09 九月 06:20:06.167 下午 MyScheduler_Worker-3 [com.anson.example1.HelloJob]

com.anson.example1.HelloJob trigger...

...

...

... 省略大部分web应用开启时的任务输出重复日志 ...

...

...

Hello Job

[DEBUG] 09 九月 06:23:26.170 下午 MyScheduler_Worker-1 [com.anson.example1.HelloJob]

com.anson.example1.HelloJob trigger...

/Users/liurenkui/myLibrary/apache-tomcat-8.5.15/bin/catalina.sh stop

09-Sep-2017 18:23:26.783 信息 [main] org.apache.catalina.core.StandardServer.await A valid shutdown command was received via the shutdown port. Stopping the Server instance.

09-Sep-2017 18:23:26.783 信息 [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"]

09-Sep-2017 18:23:26.840 信息 [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"]

09-Sep-2017 18:23:26.894 信息 [main] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]

[INFO] 09 九月 06:23:26.900 下午 localhost-startStop-2 [com.anson.listener.ApplicationContextListener]

Web应用停止...

[INFO] 09 九月 06:23:26.900 下午 localhost-startStop-2 [org.quartz.core.QuartzScheduler]

Scheduler MyScheduler_$_NON_CLUSTERED shutting down.

[INFO] 09 九月 06:23:26.900 下午 localhost-startStop-2 [org.quartz.core.QuartzScheduler]

Scheduler MyScheduler_$_NON_CLUSTERED paused.

[INFO] 09 九月 06:23:26.900 下午 localhost-startStop-2 [org.quartz.core.QuartzScheduler]

Scheduler MyScheduler_$_NON_CLUSTERED shutdown complete.

[INFO] 09 九月 06:23:26.900 下午 localhost-startStop-2 [com.anson.listener.ApplicationContextListener]

调度器已关闭:The scheduler shutdown...

09-Sep-2017 18:23:26.911 信息 [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]

09-Sep-2017 18:23:26.913 信息 [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]

09-Sep-2017 18:23:26.917 信息 [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]

09-Sep-2017 18:23:26.917 信息 [main] org.apache.c

注,如果你在Eclipse中调试,可能发现无法看到contextDestroyed方法的执行,请注意用Stop方式(图一)关闭应用,而不是Terminate(图二)。

图一

图二

如何不重复执行任务?

如果仔细阅读代码你会发现这块的代码// 触发时间点

SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever();

其中,最后结尾的是repeatForever()方法,这个方法的意思表示永远执行。

如果删除这行代码,那么job任务,也就只会执行一次,任务就挂起了,直到调度器关闭。

也可以自定义重复执行的次数,使用withRepeatCount(10)方法,10表示执行了10次

java监控定时任务_Quartz 定时任务使用 —— Web项目监听中调用(二)相关推荐

  1. java socket建立长连接_Java Web项目中使用Socket通信多线程、长连接的方法

    很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接 ...

  2. Eclipse java SE版本解决无法新建web项目问题

    Eclipse java SE版本解决无法新建web项目问题 参考文章: (1)Eclipse java SE版本解决无法新建web项目问题 (2)https://www.cnblogs.com/lf ...

  3. Eclipse Java Oxygen不能创建动态的web项目(解决方法)

    Eclipse Java Oxygen不能创建动态的web项目(解决方法) 一.eclipse安装J2EE插件 一.eclipse安装J2EE插件 Oxygen版本Eclipse没有toamct开发工 ...

  4. 把myeclipse中的web项目导入eclipse中不能编程web项目的解决办法

    title: 把myeclipse中的web项目导入eclipse中不能编程web项目的解决办法 tags: grammar_cjkRuby: true --- 右键单击项目,properties-- ...

  5. 【在web项目jsp页面自动生成二维码功能】

    在web项目jsp页面自动生成二维码功能 原文: http://www.cnblogs.com/gczmn/. https://www.jq22.com/jquery-info294/. 先将下面的文 ...

  6. java多进程端口复用_多个程序监听同一端口 - socket端口复用技术

    对于多个程序绑定同一个端口我们遇到最多的是(Port 80 was already in use),也就是说端口被占用,不能重复绑定,但是操作系统内核支持通过配置socket参数的方式来实现多个进程绑 ...

  7. java多进程端口复用_多个程序监听同一端口 - socket端口复用技术

    对于多个程序绑定同一个端口我们遇到最多的是(Port 80 was already in use),也就是说端口被占用,不能重复绑定,但是操作系统内核支持通过配置socket参数的方式来实现多个进程绑 ...

  8. java手机验证码登陆_在Web项目中手机短信验证码实现的全过程记录

    这篇文章主要给大家介绍了关于在Web项目中实现短信验证码的全过程记录,文中通过示例代码介绍的非常详细,在文末跟大家提供了源码下载,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧. 前言 最近在做 ...

  9. java war包怎么运行_springboot web项目打jar或者war包并运行的实现

    (一)springboot web项目打jar包 1.打包 两种打包方式 maven命令打包 切换目录到工程根下,pom.xml所在位置,运行maven的打包命令 mvn clean package ...

最新文章

  1. 如何强制“ git pull”覆盖本地文件?
  2. 设计模式复习-模板方法模式
  3. Python中bytes和str区别详细介绍
  4. Dart 流中的 listen 和 forEach 有什么区别?
  5. CVPR 2017 ADNet:《 Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning》论文笔记
  6. HBase环境搭建与使用
  7. JAVA无法加载此类文件,Java 7错误:无法加载本机库:ld.so.1:java:致命:libscf.so.1:打开失败:没有此类文件或目录...
  8. 工业相机和普通相机的区别详解_数码单反相机和胶片单反相机的区别
  9. 如何优雅地抄袭代码?天下代码一大抄,这才是正确的姿势
  10. app:利用HBuilder打包webpack项目
  11. 最佳牛围栏题解 二分答案
  12. 【2020牛客多校5:D】Drop Voicing(LIS+推理)
  13. 引文工具的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  14. 概率笔记4——重要公式
  15. 关于微信第三方平台$APPID$.wx.abc.com的问题
  16. 一页纸项目管理pdf_项目管理,一页纸就够了
  17. 网络安全技术及应用第3版 主编贾铁军等——教材习题 期末重点 复习题 知识提炼(第1章 网络安全基础)
  18. 藏宝阁显示角色可买服务器,梦幻西游藏宝阁里面买角色时选的可转入服务器是不是一定可以转...
  19. Linux中文件传输、解压缩文件
  20. Wondershare PDFelement for Mac v8.6.1 中文版 – 强大的PDF编辑工具

热门文章

  1. 装饰者模式Decorator
  2. VIM之快速搜索跳转
  3. 【杂谈】FilterChain相关知识整理
  4. 【LayaAir2.0】LayaAir2.0新手入门指南(目录)
  5. 告别繁琐滑动,微信小程序一键回到顶部功能
  6. 单片机实验----控制数码管的动态显示
  7. 使用Docker-Compose搭建Redis集群
  8. vue组件间通信7种方式
  9. 0x80070003系统找不到指定路径_Win7系统安装MySQL之后找不到指定文件与服务如何解决?...
  10. 图书管理系统( JSP + JDBC + Servlet )实现-01: 流程分析和数据库建表阶段