应该如何正确使用Quartz

应该如何正确使用Quartz,第1张

第一步

导入相关的jar包

第二步

创建定时任务

一个定时任务对应一个Job实现类。例如:

MyJob类为需要定时执行的类 --->

public class MyJob implements Job {

//MyJob类为需要定时执行的类,execute为定时执行的方法。一个定时任务对应一个Job实现类。

@Override

public void execute(JobExecutionContext arg0) throws JobExecutionException {

//业务逻辑

System.out.println("执行时间:"+new Date())

}

}

第三步

执行都是任务

public static void main(String[] args) throws Exception {

//SchedulerFactory 是一个接口,用于Scheduler的创建和管理

SchedulerFactory factory = new StdSchedulerFactory()

//从工厂里面拿到一个scheduler实例

//计划表(可能翻译的不太贴切),现在我们有了要做的内容,

//与调度程序交互的主要API

/*

* Scheduler的生命期,从SchedulerFactory创建它时开始,

到Scheduler调用shutdown()方法时结束;Scheduler被创建后,

可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的 *** 作

(如暂停Trigger)。但是,Scheduler只有在调用start()方法后,

才会真正地触发trigger(即执行job)

*/

Scheduler scheduler = factory.getScheduler()

//具体任务.

//用于定义作业的实例

//JobBuilder - 用于定义/构建JobDetail实例,用于定义作业的实例。

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

//Trigger(即触发器) - 定义执行给定作业的计划的组件

//TriggerBuilder - 用于定义/构建触发器实例

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

.withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?")).build()

scheduler.scheduleJob(job, trigger)

scheduler.start()

}

路径定义一个或多个形状或子路径。 子路径可以包含直线,曲线或两者。 它可以是开放的或封闭的。 子路径可以是简单的形状,例如线,圆,矩形或星形,或者更复杂的形状,例如山脉的轮廓或抽象涂鸦。 图3-1显示了您可以创建的一些路径。 直线(图中左上角)是虚线;线条也可以是实心的。 弯曲的路径(在中间的顶部)由几条曲线组成,是一条开放的路径。 同心圆被填充,但没有被描边。 加利福尼亚州是一条封闭的道路,由许多曲线和线条组成,路径既有描边也有填充。 星星说明了填充路径的两个选项,您将在本章后面阅读这些选项。

在本章中,您将了解构成路径的构建块,如何描边和绘制路径以及影响路径外观的参数。

路径创建和路径绘制是单独的任务。 首先,您创建一个路径。 如果要渲染路径,请求 Quartz 绘制它。 如图3-1所示,您可以选择描边路径,填充路径,或者描边和填充路径。 您还可以使用路径来约束路径边界内其他对象的绘制,实际上是创建剪切区域。

图3-2显示了已绘制的路径,其中包含两个子路径。 左边的子路径是一个矩形,右边的子路径是由直线和曲线组成的抽象形状。 每个子路径都被填充并且其轮廓被描边。

图3-3显示了独立绘制的多条路径。 每条路径都包含一条随机生成的曲线,其中一些曲线已填充,另一些曲线则被描边。绘图通过裁剪区域约束到圆形区域。

子路径由线,弧和曲线构成。 Quartz还提供了便捷功能,可通过单个函数调用添加矩形和椭圆。 点也是路径的基本构建块,因为点定义了形状的起始和结束位置。

点是x和y坐标,用于指定用户空间中的位置。 您可以调用函数 CGContextMoveToPoint 来指定新子路径的起始位置。 Quartz跟踪当前点,这是用于路径构建的最后位置。 例如,如果调用函数 CGContextMoveToPoint 将位置设置为(10,10),则会将当前点移动到(10,10)。 如果然后绘制一条长50个单位的水平线,则该线上的最后一个点(60,10)将成为当前点。 始终从当前点开始绘制直线,圆弧和曲线。

大多数情况下,通过向Quartz函数传递两个浮点值来指定一个点来指定x和y坐标。 某些函数要求您传递 CGPoint 数据结构,该结构包含两个浮点值。

一条线由其端点定义。 它的起始点始终假定为当前点,因此在创建线时,只指定其端点。 使用函数 CGContextAddLineToPoint 将单行线附加到子路径。

您可以通过调用函数 CGContextAddLines 将一系列连接的线添加到路径中。 您将此函数传递给一系列点。 第一点必须是第一行的起点,剩下的点是端点。 Quartz在第一个点开始一个新的子路径,并将一个直线段连接到每个端点。

弧是圆弧段。 Quartz提供了两个创建弧的函数。 函数 CGContextAddArc 从圆创建一个弯曲的段。 您可以指定圆的中心,半径和径向角(以弧度表示)。 您可以通过指定 2 pi 的径向角度来创建整圆。 图3-4显示了独立绘制的多条路径。 每条路径包含一个随机生成的圆;有些被填满,有些被描边。

当您想要对矩形的角进行圆角时, CGContextAddArcToPoint 函数是理想的选择。 Quartz使用您提供的端点来创建两条切线。 您还提供了Quartz切割圆弧的圆的半径。 弧的中心点是两个半径的交点,每个半径垂直于两条切线中的一条。 弧的每个端点都是其中一条切线上的切点,如图3-5所示。 圆圈的红色部分实际上是绘制的。

如果当前路径已包含子路径,则Quartz会将当前点的直线段附加到弧的起始点。 如果当前路径为空,Quartz会在弧的起始点创建一个新的子路径,并且不会添加初始直线段。

二次和三次Bézier曲线是代数曲线,可以指定任意数量的有趣曲线形状。 通过将多项式公式应用于起点和终点以及一个或多个控制点来计算这些曲线上的点。 以这种方式定义的形状是矢量图形的基础。 公式比位数组更紧凑更容易存储,并且具有可以在任何分辨率下重新创建曲线的优点。

图3-6显示了通过独立绘制多个路径创建的各种曲线。 每条路径包含一条随机生成的曲线;有些被填满,有些被描边。

在许多数学文本和描述计算机图形的在线资源中讨论了产生二次和三次Bézier曲线的多项式公式,以及如何从公式生成曲线的细节。 这里不讨论这些细节。

使用 CGContextAddCurveToPoint 函数,使用您指定的控制点和端点,从当前点追加三次贝塞尔曲线。 图3-7显示了由图中所示的当前点,控制点和端点产生的三次Bézier曲线。 两个控制点的放置决定了曲线的几何形状。 如果控制点都在起点和终点之上,则曲线向上拱起。 如果控制点都低于起点和终点,则曲线向下拱起。

您可以通过调用 CGContextAddQuadCurveToPoint 函数并指定控制点和端点,从当前点追加二次Bézier曲线。 图3-8显示了使用相同端点但控制点不同的两条曲线。 控制点确定曲线拱起的方向。 由于二次曲线仅使用一个控制点,因此不可能使用二次贝塞尔曲线创建尽任意多的有趣形状。 例如,无法使用单个控制点创建交叉。

要关闭当前子路径,应用程序应调用 CGContextClosePath 。 此函数添加从当前点到子路径起点的线段,并关闭子路径。 以子路径起点结束的直线,圆弧和曲线实际上不会关闭子路径。 您必须显式调用 CGContextClosePath 才能关闭子路径。

一些Quartz函数将路径的子路径视为应用程序关闭它们。 这些命令将每个子路径视为您的应用程序调用 CGContextClosePath 来关闭它,隐式地将一个线段添加到子路径的起始点。

关闭子路径后,如果应用程序进行额外调用以向路径添加直线,圆弧或曲线,Quartz将从刚刚关闭的子路径的起点开始一个新的子路径。

椭圆本质上是一个压扁的圆圈。 您可以通过定义两个焦点来创建一个焦点,然后绘制位于一定距离的所有点,以便将椭圆上任意点到一个焦点的距离加上到从该点到另一个焦点的距离这个和始终是相同的值。 图3-9显示了独立绘制的多条路径。 每条路径包含一个随机生成的椭圆;有些被填满,有些被描边。

您可以通过调用函数 CGContextAddEllipseInRect 将椭圆添加到当前路径。 您提供了一个定义椭圆边界的矩形。 Quartz使用一系列Bézier曲线近似椭圆。 椭圆的中心是矩形的中心。 如果矩形的宽度和高度相等(即正方形),则椭圆为圆形,半径等于矩形宽度(或高度)的一半。 如果矩形的宽度和高度不相等,则它们定义椭圆的长轴和短轴。

添加到路径的椭圆以移动 *** 作开始,以关闭子路径 *** 作结束,所有移动都以顺时针方向定向。

您可以通过调用函数 CGContextAddRect 将矩形添加到当前路径。 您提供了一个CGRect结构体,其中包含矩形的原点及其宽度和高度。

添加到路径的矩形以移动 *** 作开始,以关闭子路径 *** 作结束,所有移动都以逆时针方向定向。

您可以通过调用 CGContextAddRects 函数并提供CGRect结构数组,将许多矩形添加到当前路径。 图3-10显示了独立绘制的多条路径。 每个路径包含一个随机生成的矩形;有些被填满,有些被描边。

如果要在图形上下文中构造路径,可以通过调用函数 CGContextBeginPath 来发出 Quartz 信号。接下来,通过调用函数 CGContextMoveToPoint ,在路径中设置第一个形状或子路径的起点。建立第一个点后,可以在路径中添加直线,圆弧和曲线,请记住以下内容:

绘制路径后,将从图形上下文中刷新它。您可能不希望如此轻易地丢失路径,特别是如果它描绘了您想要反复使用的复杂场景。因此,Quartz提供了两种用于创建可重用路径的数据类型- CGPathRef 和 CGMutablePathRef 。您可以调用函数 CGPathCreateMutable 来创建可变的 CGPath 对象,您可以在其中添加直线,圆弧,曲线和矩形。 Quartz提供了一组CGPath函数,这些函数与 The Building Blocks 中讨论的函数并行。路径函数在 CGPath 对象上运行,而不是在图形上下文上运行。这些函数是:

有关路径函数的完整列表,请参阅 Quartz 2D Reference Collection 。

如果要将路径附加到图形上下文,请调用函数 CGContextAddPath 。路径保留在图形上下文中,直到 Quartz 绘制它。您可以通过调用 CGContextAddPath 再次添加路径。

Quartz是一款由java写成的作业调度框架,在大量javase/javaee应用中被用来做定时任务,它功能强大而又不失使用简单性。

Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可。

1、Job

表示一个工作,要执行的具体内容。此接口中只有一个方法

void execute(JobExecutionContext context)

线程运行Job时会把JobDataMap封装到JobExecutionContext里作为execute方法的参数,jobdetail是对job的封装,里面有Job的class,对应的数据, 名称,分组等

2、JobDetail

JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。

3、Trigger代表一个调度参数的配置,job下次什么时候执行存放在trigger中。

4、Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。

5、QuartzSchedulerResources相当于调度的资源存放器,包含了JobStore, ThreadPool等资源,调度都是通过QuartzSchedulerResources获取相关属性的。

6、jobStore是任务和触发器存储地方,它里面提供大量类似于增删改的 *** 作任务方法。

5、QuartzSchedulerThread是一个调度线程,ThreadPool是一个执行线程池,下图是运行后的线程栈:

Quartz是通过对用户暴露出Scheduler来进行任务的 *** 作,它可以把任务JobDetail和触发器Trigger加入任务池中,可以把任务删除,也可以把任务停止,scheduler把这些任务和触发器放到一个JobStore中,这里jobStore有内存形式的也有持久化形式的,当然也可以自定义扩展成独立的服务。

它内部会通过一个调度线程QuartzSchedulerThread不断到JobStore中找出下次需要执行的任务,并把这些任务封装放到一个线程池ThreadPool中运行,它的组件结构如下图:

各类的调用关系如下图:

下面看看quartz的简单实现:

首先是一个调度管理类:

接下来实现job接口:

测试主函数如下:

运行结果如下:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11413623.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存