Spring+Quartz(一)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Quartz是一个非常优秀的任务调度引擎,详情请见官网:http://www.quartz-scheduler.org/

而Spring很好地集成了Quartz,为企业级的任务调度提供了方便。

 

下面先看一个实现了Job接口的任务HelloWorldJob:

Java代码

package com.springQuartz.example;

import java.util.Map;

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

public class HelloWorldJob implements Job{

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        
        Map properties = context.getMergedJobDataMap();
        
        System.out.println("Hello World!");
        System.out.println("Previous Fire Time: "+context.getPreviousFireTime());//上次触发任务的时间
        System.out.println("Current Fire Time: "+context.getFireTime());//当然触发时间
        System.out.println("Next Fire Time: "+context.getNextFireTime());//下次触发时间
        
        System.out.println(properties.get("message"));
        System.out.println();
    }
    
}

 

这个Job输出"HelloWorld",同时输出上次、本次及下次触发的时间。

 

我们看一下在applicationContext.xml中的配置:

Xml代码

<bean id="job" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="com.springQuartz.example.HelloWorldJob"/>
    <property name="jobDataAsMap">
         <map>
            <entry key="triggerMessage" value="Job Message In JobDetail"/> <!--设置JobDetail中的值-->
         </map>
    </property>
</bean>
    
<bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    <property name="jobDetail" ref="job"/> <!--触发的job引用-->
    <property name="startDelay" value="1000"/> <!--设置延迟1秒后运行-->
    <property name="repeatInterval" value="10000"/> <!--设置每10秒触发一次-->
    <property name="jobDataAsMap">
          <map>
          <entry key="triggerMessage" value="Job Message From Trigger"/> <!--设置Trigger中的值-->
          </map>
    </property>
</bean>

<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref local="trigger"/>    
        </list>
    </property>
</bean>

 

我们将HelloWorldJob实现成JobDetailBean类,并配置触发器simpleTriggerBean

 

最后我们的测试类:

Java代码

package com.springQuartz.test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String args[]){
        BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}

 

运行结果如下:

运行结果代码

2011-01-16 20:48:18,437 INFO - Starting Quartz Scheduler now
Hello World!
Previous Fire Time: null
Current Fire Time: Sun Jan 16 20:48:19 CST 2011
Next Fire Time: Sun Jan 16 20:48:29 CST 2011
Job Message From Trigger

Hello World!
Previous Fire Time: Sun Jan 16 20:48:19 CST 2011
Current Fire Time: Sun Jan 16 20:48:29 CST 2011
Next Fire Time: Sun Jan 16 20:48:39 CST 2011
Job Message From Trigger

  1.  

下面说明几点:

1)首次触发是输出的Previous Fire Time为null

2)jobDataAsMap的说明:在HelloWorldJob.java中getMergedJobDataMap是JobDetail和 Trigger上的JobDataMap的合并,两者数据如果冲突,则Trigger上的数据将覆盖JobDetail中的。运行结果也证明了,我们在 Job中设置的值没有输出,而输出了"Job Message From Trigger"。

3)我们看到HelloWorldJob实现了Job接口,代码上依赖了Quartz的接口

 

下面我们讨论另外一种更普遍的,去除接口依赖的实现

 

主要的applicationContext.xml文件的配置

Xml代码

<bean id="jobService" class="com.springQuartz.service.JobServiceImpl">
</bean>
    
<bean id="invokeJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject">
        <ref bean="jobService" /> <!--目标Job-->
    </property>
    <property name="targetMethod">
        <value>JobServiceImpl中的特定方法</value> <!--目标方法-->
    </property>
    <property name="concurrent">
        <value>false</value> <!--设置是否同步-->
    </property>
</bean>
    
<bean id="jobServiceCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="invokeJob" />
    <property name="cronExpression" value="5/10 * * * * ?" />
</bean>

<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref local="jobServiceCronTrigger"/>
        </list>
    </property>
</bean>

 

 

 

1)首先我们配置具体的Job信息--JobServiceImpl,这个类可以不实现Quartz中的Job接口

2)最主要的MethodInvokingJobDetailFactoryBean,可以使得1)可行

3)相对于上面的例子,我们使用CronTriggerBean实现trigger,实现更灵活的时间配置

4)默认情况下,Quartz Jobs是无状态的,可能导致jobs之间互相的影响。如果你为相同的JobDetail 指定两个Trigger, 很可能当第一个job完成之前,第二个job就开始了。如果JobDetail 对象实现了Stateful 接口,就不会发生这样的事情。 第二个job将不会在第一个job完成之前开始。为了使得jobs不并发运行,设置MethodInvokingJobDetailFactoryBean 中的concurrent 标记为false

 

转载于:https://my.oschina.net/u/2365087/blog/690264

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux sudo 版本,Linu下如何升级当前sudo版本

Sudo 的全称是“superuserdo”&#xff0c;它是Linux系统管理指令&#xff0c;允许用户在不需要切换环境的前提下以其它用户的权限运行应用程序或命令&#xff0c;通常是以 root 用户身份运行命令&#xff0c;以减少 root 用户的登录和管理时间&#xff0c;同时提高安全性。该漏…

LaTeX技巧205:使用split输入多行公式技巧

我们在输入多行公式的时候&#xff0c;split&#xff0c;array&#xff0c;multiline&#xff0c;align&#xff0c;aligned等等都是我们可以选用的环境&#xff0c;这里介绍split的使用方法。演示效果图&#xff1a;演示代码&#xff1a;\documentclass{article}\pagestyle{em…

linux纯内核直接用吗,Linux:为啥内核有的变量没有初始化就敢直接使用?

一、问题为啥内核有的变量没有初始化就敢直接使用&#xff1f;二、分析看上图&#xff0c;其中的5747行的变量nid的确没有定义&#xff0c;就直接使用了&#xff0c;这么做没有问题吗&#xff1f;其实大家仔细看一下&#xff0c;5765行是一个宏&#xff0c;到内核源码去找该宏的…

sdr 软件_【火腿专题】购买软件定义无线电(SDR)还是传统无线电台?追求欲望无止境...

软件定义无线电与传统无线电选择作者&#xff1a;Onno VK6FLAB有一段时间&#xff0c;我一直在解释软件无线电(SDR)的一些内部工作方式是如何运作的&#xff0c;以便深入了解原因和方法的细节。这种探索是在一个新世界的背景下进行的&#xff0c;在这个世界里&#xff0c;有无数…

linux文本运行层次,Linux基础知识之---文件系统层级结构

#Linux基础知识之---文件系统层级结构(Linux系统)[基础知识&#xff0c;文件系统&#xff0c;层级结构&#xff0c;FHS]一切皆文件&#xff1a; 在Linux中&#xff0c;无论是目录、配置、cpu、内存、键盘、鼠标、或者运行中的系统及内核、甚至临时缓存也都有对应的文件。“一切…

服务器搭建-Linux基础知识

服务器搭建还是需要一些Linux知识的&#xff0c;这节就聊点基础的。 文件权限操作 查看权限 Linux中每个文件对每个用户来说都有对应的权限&#xff0c;在任一路径中输入ll就可以查看这些信息&#xff1a; rootip-*** /usr/local # ll total 32K drwxr-xr-x 2 root root 4.0K J…

seo从入门到精通_从入门到精通,新人必看的3本书SEO书籍

SEO入门书本引荐&#xff1a;从入门到通晓&#xff0c;新人必看的3本书在这个网上学习泛滥的年代&#xff0c;很多人都习气在网络上找教程学习&#xff0c;无论上视频教程&#xff0c;学习论坛&#xff0c;或是网上课堂等等。但也有些人仍是更习气看书学习的&#xff0c;很多人…

Hession矩阵与牛顿迭代法

1、求解方程。 并不是所有的方程都有求根公式&#xff0c;或者求根公式很复杂&#xff0c;导致求解困难。利用牛顿法&#xff0c;可以迭代求解。 原理是利用泰勒公式&#xff0c;在x0处展开&#xff0c;且展开到一阶&#xff0c;即f(x) f(x0)(x&#xff0d;x0)f(x0) 求解方程f…

抽象工厂模式_设计模式——抽象工厂模式

阅读目录使用频率&#xff1a;★★★★★一、什么是抽象工厂模式二、补充说明三、角色四、例子使用频率&#xff1a;★★★★★一、什么是抽象工厂模式就是对一组具有相同主题的工厂进行封装(维基百科解释的很到位)&#xff1b;例如&#xff1a;生产一台PC机&#xff0c;使用工…

windows(win7,win8,xp)hosts文件找不到原因分析及解决方法

2019独角兽企业重金招聘Python工程师标准>>> 一般情况hosts文件是保存在C:\windows\System32\Drivers\Etc 文件夹上&#xff0c;由于安装是win7系统&#xff0c;在这个路径上就能找到这个hosts文件。如果你在该路径下没有找到这个文件的话&#xff0c;一般是以下几种…

sql 显示百分比_轻松搞定数据分析之SQL——简单查询

每天早起或者睡前听一首温柔而美好的音乐&#xff0c;是一件很幸福的事情&#xff0c;无论你是否懂音乐&#xff0c;它都能带你发现生活中的隐藏的那些美好&#xff0c;今天我们先来一起欣赏Mindy Gledhill的单曲《California》California (网易云音乐),每次我听到这首歌&#…

SpringMVC 中设置日期字符串转换格式

2019独角兽企业重金招聘Python工程师标准>>> 在使用SpringMVC的项目中经常遇到 controller 参数中接收Date类型的数据&#xff0c;但是页面传过来的参数又是日期字符串&#xff0c;会出现转换异常。 由于项目需要支持两种日期格式所以从写了一个日期转换器。网友可以…

操作系统 非连续分配_操作系统中的连续和非连续内存分配

操作系统 非连续分配In this article, we will learn about the different types of memory management techniques and also the pros and cons of different memory management techniques. 在本文中&#xff0c;我们将学习不同类型的内存管理技术 &#xff0c;以及不同内存管…

文件名重定向到txt中Linux,Linux上glob用于实现文件名的通配、IO重定向及管道

Linux中所谓的通配是指&#xff0c;显示以指定条件为条件的文件&#xff1b;即通配的含义是指搜寻以已知条件为前提的目标文件。常用文件通配符有&#xff1a;文件通配符含义例子*任意长度的任意字符如a*,搜寻所有以a为首的文件名的文件&#xff1f;任意的单一字符如a&#xff…

分形与数据结构第二篇

一、分形之 迭代实现分形 本次的图形都是在之前的画图工具中实现的。 首先&#xff0c;还是和原来一样建立一个JButton元素组件&#xff0c;然后加上监听方法&#xff1b;再在public void mouseClicked(MouseEvent e) {}方法中实现图形&#xff1b; else if (s.equals("图…

华为linux版笔记本安装win7,华为MateBook X Pro笔记本怎样安装win7系统

华为MateBook X Pro的制造工艺达到了业界顶级的水准&#xff0c;高达91%的屏占比真正达到了近似全面屏的观感&#xff0c;触感顺滑质感强烈的机身让人爱不释手。对于有意选购一台高端轻薄本产品的消费者来说&#xff0c;MateBook X Pro应该是你首选的对象之一。那么这款笔记本怎…

怎么使用小爱同学音响_智能音响购买指南!!!

小度音响pro100天使用感受&#xff0c;100天前我冲动消费购买了一个智能音响&#xff0c;还是对比了多个智能音响做好的决定。使用到现在显然这个冲动消费是非常划算的&#xff0c;这个智能音响完全提升了我的生活质量&#xff0c;我现在一下班就会让它播放音乐、睡觉前播放几段…

【分享】WeX5的正确打开方式(1)

最近在研究WeX5&#xff0c;想在这里记录下使用过程中的点滴&#xff0c;今天先把之前已经掌握的分享一下。WeX5官方的开发指南难度系数较大&#xff0c;面向的受众可能是已经敲过上万行代码的html5 app开发者。但是作为一个刚进入代码世界的html5 app开发宝宝&#xff0c;本人…

过滤器,绑定事件,动画

一、基本过滤器 语法描述返回值:first选取第一个元素单个元素:last选取最后一个元素单个元素:not(selector)选取去除所有与给定选择器匹配的元素集合元素:even选取索引是偶数的所有元素(index 从0开始)集合元素:odd选取索引是奇数的所有元素(index 从0开始)单个元素:eq(index)选…

python操作mysql数据库的常用方法使用详解

python操作mysql数据库1、环境准备&#xff1a; Linux安装mysql&#xff1a; apt-get install mysql-server安装python-mysql模块&#xff1a;apt-get install python-mysqldb Windows下载安装mysqlpython操作mysql模块&#xff1a;MySQL-python-1.2.3.win32-py2.7.exe 或 MySQ…