Java服务_xml配置实现Quartz执行jar包方法

Java服务_xml配置实现Quartz执行jar包方法

1.Quartz与ScheduledExecutorService的区别

Quartz和ScheduledExecutorService都可以用来执行定时轮询任务,但是Quartz的功能更加强大一些:

  • Quartz提供了很多任务监控和维护工具,如Job Persistence,Transactions,Clustering等;
  • Quartz使用cron表达式来设置任务执行时间和频率,更加灵活。

2.xml配置轮询jar包方法实例

2.1任务方法打成jar包

将如下类package打成jar包,插入定时任务springboot项目中add as library:

1
2
3
4
5
6
7
package jia.zheng.jop;

public class PrintTest {
public void work() {
System.out.println(System.currentTimeMillis() + "-----定时打印");
}
}

2.2引入Quartz依赖

在定时任务springboot项目的pom.xml文件中引入Quartz依赖,如果是spring项目则要添加版本号:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

2.3创建定时任务xml配置文件

创建spring-quartz-config.xml文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- 将定时任务所在的类加载到spring容器中,可以是项目中的类,也可以是jar包中的类 -->
<bean id="printJop" class="jia.zheng.jop.PrintTest"/>

<!-- 加载任务,注入targetObject属性和targetMethod属性,本质是动态代理-->
<bean id="printJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="printJop"/>
<property name="targetMethod" value="work"/>
<!-- concurrent属性表示并发设置,false表示下一次执行必须等待上一次执行完成,true表示可以并行执行。 -->
<property name="concurrent" value="false"/>
</bean>

<!-- 加载触发器,注入jobDetail属性和cronExpression定时执行规则属性 -->
<!-- 重要:⼀个触发器只能触发⼀个任务,⼀个任务可以被多个触发器触发。 -->
<bean id="printTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="printJobDetail"/>
<!-- 表示每5s执行一次 -->
<property name="cronExpression" value="0/5 * * * * ?"/>
</bean>

<!-- 加载总管理类,lazy-init='false'表示容器启动时就执⾏调度程序作业调度器 -->
<bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
<property name="triggers">
<list>
<ref bean="printTrigger"/>
</list>
</property>
</bean>
</beans>
  • 作为targetObject属性的bean可以是本项目的类也可以是依赖jar包中的类。本质就是将类加载到spring容器中,然后对该单例bean中的任务方法进行动态代理。
  • 配置文件中任务、触发器、总管理类三者缺一不可,总管理类只需要一个,任务和触发器可以配置多个。⼀个触发器只能配置⼀个任务,⼀个任务可以被多个触发器配置。

2.4导入配置文件

在Application类中添加@ImportResource注解:

1
2
3
4
5
6
7
@SpringBootApplication
@ImportResource("classpath:/spring-quartz-config.xml")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

2.5执行结果

项目启动时,控制台显示定时任务执行器成功初始化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  .   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.5.RELEASE)

2022-06-13 16:37:51.844 INFO 16716 --- [ main] jia.zheng.Application : Starting Application on ZBMac-G44J4T0DY with PID 16716 (/Users/jiazhengyang3/IdeaProjects/QuartzXml/target/classes started by jiazhengyang3 in /Users/jiazhengyang3/IdeaProjects/QuartzXml)
2022-06-13 16:37:51.846 INFO 16716 --- [ main] jia.zheng.Application : No active profile set, falling back to default profiles: default
2022-06-13 16:37:53.301 INFO 16716 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2022-06-13 16:37:53.324 INFO 16716 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-06-13 16:37:53.324 INFO 16716 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.19]
2022-06-13 16:37:53.423 INFO 16716 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-06-13 16:37:53.423 INFO 16716 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1530 ms
2022-06-13 16:37:53.538 INFO 16716 --- [ main] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor
2022-06-13 16:37:53.545 INFO 16716 --- [ main] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
2022-06-13 16:37:53.545 INFO 16716 --- [ main] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.1 created.
2022-06-13 16:37:53.546 INFO 16716 --- [ main] org.quartz.simpl.RAMJobStore : RAMJobStore initialized.
2022-06-13 16:37:53.546 INFO 16716 --- [ main] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.1) 'startQuertz' 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 10 threads.
Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

配置的定时任务成功执行:

1
2
3
4
5
6
7
8
2022-06-13 16:37:53.923  INFO 16716 --- [           main] org.quartz.core.QuartzScheduler          : Scheduler startQuertz_$_NON_CLUSTERED started.
2022-06-13 16:37:53.953 INFO 16716 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2022-06-13 16:37:53.956 INFO 16716 --- [ main] jia.zheng.Application : Started Application in 2.528 seconds (JVM running for 3.195)
1655109475015-----定时打印
1655109480013-----定时打印
1655109485008-----定时打印
1655109490003-----定时打印
1655109495007-----定时打印