quartz定时任务应用

1.背景介绍

Quartz是一个作业调度库,可以与任何其他软件系统集成,也可以和其他软件系统一起使用。“job scheduler”作业调度程序是一个服务组件,负责执行(或通知)其他软件组件预定(预定)时间到达。

Quartz非常灵活,并且包含多个可以单独使用或一起使用的使用范例,以便实现所需的行为,并使我们能够以对项目最为“自然”的方式编写代码。

Quartz非常轻量级,而且只需要很少的设置/配置 - 如果您的需求相对比较基本的话,它实际上可以用于“开箱即用”的。

Quartz是容错的,可以在系统重启之间持续('记住')你的预定作业。


2.知识剖析

Quartz体系结构

Job: 是一个接口,只定义一个方法execute(JobExecutionContext context),在实现接口的execute方法中编写所需要定时执行的Job(任务), JobExecutionContext类提供了调度应用的一些信息。

Job运行时的信息保存在JobDataMap实例中;

JobDetail: Quartz每次调度Job时, 都重新创建一个Job实例, 所以它不直接接受一个Job的实例,相反它接收一个Job实现类(JobDetail:描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息),

以便运行时通过newInstance()的反射机制实例化Job

Trigger:是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。

当且仅当需调度一次或者以固定时间间隔周期执行调度,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案:

Calendar:org.quartz.Calendar和java.util.Calendar不同, 它是一些日历特定时间点的集合(可以简单地将org.quartz.Calendar看作java.util.Calendar的集合——java.util.Calendar代表一个日历时间点,无特殊说明后面的Calendar即指org.quartz.Calendar)。

一个Trigger可以和多个Calendar关联, 以便排除或包含某些时间点

Scheduler:代表一个Quartz的独立运行容器, Trigger和JobDetail可以注册到Scheduler中,拥有各自的组及名称,组及名称必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法, 允许外部通过组及名称访问和控制容器中Trigger和JobDetail。

Scheduler可以将Trigger绑定到某一JobDetail中, 这样当Trigger触发时,对应的Job就被执行。一个Job可以对应多个Trigger, 但一个Trigger只能对应一个Job。可以通过SchedulerFactory创建一个Scheduler实例。Scheduler拥有一个SchedulerContext,它类似于ServletContext,保存着Scheduler上下文信息,Job和Trigger都可以访问SchedulerContext内的信息。SchedulerContext内部通过一个Map以键值对的方式维护这些上下文数据,SchedulerContext为保存和获取数据提供了多个put()和getXxx()的方法。


3.常见问题

quartz与公司框架结合遇到的问题

4.解决方案

我们直接看视频

5.编码实战


6.扩展思考

为什么要把quartz与spring结合起来


7.参考文献

http://chuhanzhi.com/?p=45



第一个问题: 普通类调用spring里面bean的话自身也需要加入spring管理

如果想用@autowired,那么这个类本身也应该是在spring的管理下 的,即你的Util也要标注为一个component(或Service),这样spring才知道要注入依赖;

如果不标注为@Component的话,此时不能通过@autowired来注入依赖,只能通过ApplicationContext来取得标注为Service的类.

第二个问题:@service 和@Compent的区别...目前区分两者的使用场景还不是特别明确,.按照今天出现问题来讲,调用service的类需要加上@Controlle或@Component注解,,不是controller层要加上@component注解

@Service用于标注业务层组件

@Controller用于标注控制层组件(如struts中的action)

@Repository用于标注数据访问组件,即DAO组件

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

第三个问题:如果在rmi里面反射service方法时反射client里面的接口. 因为service接口无法实例化.会导致方法为空

第四个问题: test测试类无法加载多个xml文件.

第五个问题:通过反射调用client实现service里面的方法时,无法加载client里面构造的serviceBean.最后通过在一个反射里面添加第二个反射任务(使用applicationContext的getBean方法加载xml文件里面的bean获取).

第六个问题: 反射中getdeclaredmethod与 getmethod区别

public Method[] getMethods()返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。

public Method[] getDeclaredMethods()对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。当然也包括它所实现接口的方法。


PPT



undefined_腾讯视频

谢谢观看

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

技能树.IT修真院

“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。

这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~

www.jnshu.com/login/1/14708688

你可能感兴趣的:(quartz定时任务应用)