定时器(Quartz)

Spring 整合Quartz.
1). 客户在什么时候会变为 “流失预警” 状态呢 ? 若客户已经有连续 6 个月和公司没有任何的业务往来,则该客户有 “正常” 状态变为 “流失预警"状态.
2). 当点击 “客户流失管理” 的超链接时
①. 每点击一次,就查询一次数据库,检查哪些客户需要变为流失预警状态,若需要变化,则发送对应的 SQL 语句.
②. 实际上不需要时刻都取查询,只需要在每一天的指定时间查询,并发送UPDATE 语句即可. 这就需要进行"定时调度”
3). 整合 Quartz 的过程.
①. 加入 jar 包.

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<!-- 指定端口 -->
<port>8080</port>
<!-- 请求路径 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>```



```②. 在配置文件中配置 Quartz, 参看 Spring 官方文档, 加入如下的配置:
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="customerDrainService" />
<property name="targetMethod" value="callDrainCheckProcedure" />
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail" />
<property name="cronExpression" value="0 24 11 * * ?" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
<property name="startupDelay" value="10"></property>
</bean>


特别提醒:注意修改web.xml文件,加载这个配置文件信息哦!
Cron表达式:
1.基本格式[用空格分开的七部分时间元素]
按顺序依次为
①秒(0~59)
②分钟(0~59)
③小时(0~23)
④天(月)(0~30,但是你需要考虑你月的天数)
⑤月【day of month】(0~11)
⑥天(星期)【day of week】(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
⑦年份(1970-2099)
设置方式:
①、指定具体值:5
②、连续区间:9-12
③、有间隔的区间:8-18/4
斜杠后面为间隔跨度
④、具体值的列表
通配符:
[1]:表示在取值范围内的所有时间点都执行调度任务
例如:用
指定秒,表示每秒都执行任务;用指定星期表示一周内的每一天都执行任务
[2]/:用于表示时间间隔
例如:用
/5指定秒,表示每隔5秒执行一次任务。
[3]?:仅用于day-of-month字段或day-of-week字段,表示不指定值。由于某个月的几号和星期几很难统一
成同一天。所以为了避免冲突,这两个字段必须有一个字段设置为?
[4]#:井号(#):只能使用在周域上,用于指定月份中的第几周的哪一天,例如6#3,意思是某月的第三个
周五 (6=星期五,3意味着月份中的第三周)
[5]L:某域上允许的最后一个值。只能使用在日和周域上。当用在日域上,表示的是在月域上指定的月份的最后一天。
用于周域上时,表示周的最后一天,就是星期六
[6]W:W 字符代表着工作日 (星期一到星期五),只能用在日域上,它用来指定离指定日的最近的一个工作日

示例:
表达式 说明
=========================================================================
秒 分 时 日 月 星期 年 (年不写就表示*)

0 0 12 * * ? 每天中午12点触发
0 15 10 ? * * 每天上午10:15触发
0 15 10 * * ? 每天上午10:15触发
0 15 10 * * ? * 每天上午10:15触发
0 15 10 * * ? 2005 2005年每天上午10:15触发

cron表达式在线生成器:http://cron.qqe2.com/

JavaFreeChart:性能比较低,在服务器渲染
HighChart:国外,在浏览器端渲染
Echarts: 百度,在浏览器端渲染 炫酷
D3:

统计分析: 领导

关于 mybatis 调用存储过程
1). 在 Oracle 中定义了一个存储过程:
CREATE OR REPLACE PROCEDURE check_drain
IS
–声明游标
CURSOR drain_cursor IS
–查询哪些’正常状态’的客户已经连续 6 个月和公司没有任何的业务往来.
SELECT c.id, name, manager_id, o.order_date
FROM customers c
JOIN (SELECT customer_id, MAX(order_date) order_date
FROM orders
GROUP BY customer_id) o
ON c.id = o.customer_id
WHERE o.order_date < SYSDATE - 5
–WHERE o.order_date < ADD_MONTHS(SYSDATE, -6)
AND c.state = ‘正常’;
BEGIN
–对游标进行遍历
FOR drain_info IN drain_cursor LOOP
–向流失预警的数据表中插入一条记录
INSERT INTO customer_drains(id, customer_id, last_order_date, status)
VALUES(CRM_SEQ.NEXTVAL, drain_info.id, drain_info.order_date, ‘流失预警’);
–把当前客户的状态修改为流失预警状态
UPDATE customers SET state = ‘流失预警’ WHERE id = drain_info.id;
END LOOP;
END;
2). mybatis 如何去调用一个存储过程:
①. 使用 {call [(,, …)]} 格式来调用存储过程.
②. 在 mybatis 中使用 @update 注解或 update 节点即可完成调用.
@Update(“{call check_drain()}”)
void callDrainCheckProcedure();
3. 最终的实现效果:在每天的 0:02 分,由 Spring 的 IOC 容器来调用 Quartz, 进而调用存储过程,完成检查及修改操作.
二. 统计查询:
1). 返回的类型实际上可以是 Map 类型的 List

2). SpringMVC 如何来整合 jFreeChart 或 POI 或其他的第三方的视图.
①. 自定义 View. 并把其纳入到 IOC 容器中.
②. 使用 BeanNameViewResolver

定时器(Quartz)

// cron表达式 秒 分 时 dayofMonth Month dayOfWeek Year 最高2099
// *:表示任意
// ?:表示无所谓
// - :表示连续的一段时间
// /n : 表示每隔n秒执行一次
// , : 逗号是定义哪个时候执行可以定义多个
// # : 第几周的第几天
// L :表示一周或者一个月的最后一天

@Slf4j
 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
 @EnableDiscoveryClient

 @EnableScheduling  //开启定时器
 public class ServiceTaskApplication {
     public static void main(String[] args) {
         SpringApplication.run(ServiceTaskApplication.class, args);
         log.info("***************** 定时器服务启动了********");
     }
 }```

 //    cron表达式   *:表示任意
 //                ?:表示无所谓
 //                - :表示连续的一段时间@Scheduled(cron = "* * * * * ?")  //表示每秒都会执行一次
     public void printTime(){
         System.out.println(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));}
@Scheduled(cron = "1-5 * * * * ?")  //表示每秒的1-5秒都会执行一次
 public void printTime(){
     System.out.println(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));}
 @Scheduled(cron = "/3 * * * * ?")  //表示每隔三秒就会执行一次
 public void printTime(){
     System.out.println(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));}
 @Scheduled(cron = "1,3,5,7,9,10,11 * * * * ?")  //表示每分钟的第一秒,第三秒 第五秒,第7,9,10,11秒都会执行一次
 public void printTime(){
     System.out.println(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));}//                 # : 第几周的第几天
 @Scheduled(cron = "1,3,5,7,9,10,11 * * * * 5#1")  // 5#1 表示第一周的周四
 public void printTime(){
     System.out.println(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot中的定时器Quartz是一种基于Java的开源调度框架,可以用于在指定时间执行任务或在指定时间间隔内重复执行任务。它提供了丰富的API和灵活的配置选项,可以满足各种不同的调度需求。在Spring Boot中,可以通过简单的配置和注解来使用Quartz定时器,使得任务调度变得更加简单和方便。 ### 回答2: Quartz是一个灵活的、强大的、开源的、多功能的企业级调度器,在Java开发中非常流行。Spring Boot与Quartz集成后,可以方便地实现复杂的任务调度,例如定时任务、周期任务、准实时任务等。本文将从以下几个方面介绍Spring Boot中Quartz定时器的使用。 一、pom.xml配置 在pom.xml文件中添加如下依赖关系: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 二、Spring Boot Quartz配置 在Spring Boot中配置Quartz调度器非常简单。你只需要在application.properties中配置Quartz,然后自动创建并初始化Quartz Scheduler Factory Bean来将其绑定到上下文中。以下是Quartz的基本配置: ``` spring.quartz.scheduler-name=quartzScheduler spring.quartz.job-store-type=jdbc spring.quartz.jdbc.initialize-schema=always ``` 上面的配置指示Quartz使用“quartzScheduler”作为任务调度器名称,指定任务存储类型为jdbc,启用数据库模式自动初始化。 三、注入Scheduler 在Spring Boot应用程序中使用Quartz定时器需要注入Scheduler接口实例,它是Spring Boot Quartz集成中的核心接口。您可以使用@Autowire注释在Spring Boot组件中注入调度程序。 ``` @Autowired private Scheduler scheduler; ``` 四、定义Job 使用Spring Boot和Quartz可以定义三个不同类型的任务:StatefulJob、JobDetail、SimpleJob。接下来我们先简单介绍一下StatefulJob和JobDetail。 StatefulJob StatefulJob继承Job接口,用于具有状态的Job。在上一次执行结束之前,不会开始下一次执行。使用@DisallowConcurrentExecution注解即可定义状态化任务。 ``` @DisallowConcurrentExecution public class MyStatefulJob implements StatefulJob { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // job logic here } } ``` JobDetail JobDetail是Job的实例,它指定了Job的执行类、Job的名称和JobDataMap。您可以通过使用JobDetailBuilder构建器构建JobDetail。Job的类必须实现execute方法。 ``` JobDetail jobDetail = JobBuilder.newJob(MyJob.class) .withIdentity("myJob") .build(); ``` 五、定义Trigger Trigger是定义任务执行计划的Quartz组件。可以定义Triggers在给定的时间触发,或在给定的时间间隔内重复执行。以下是触发器的基本定义: ``` SimpleTrigger - 简单的触发器,它在给定的时间后只触发一次,或在执行一定次数后停止。 CronTrigger - 使用Cron表达式定义的触发器,可以在指定的时间间隔内重复执行任务。 CalendarIntervalTrigger - 在一个日历时间间隔内以指定的频率触发任务的触发器。 ``` 在Spring Boot中使用TriggerBuilder构建器来定义Trigger,例如: ``` Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10)) .build(); ``` 以上代码定义了一个Simple Trigger,每隔10秒触发一次任务。 六、将Job和Trigger一起使用 在Spring Boot中,将Job和Trigger一起使用是非常简单的。只需要在Scheduler中添加它们即可。事务同时被委托给Quartz Scheduler,Job和Trigger可以在同一个事务中使用。 ``` scheduler.scheduleJob(jobDetail, trigger); ``` 七、Spring Boot Quartz集群 当在多个应用程序实例中使用Quartz时,您需要确保任务不会同时执行。因此,Quartz提供了一个集群模式,在集群模式下,多个Quartz Scheduler实例将一起协作以确保每个任务仅执行一次。 在Spring Boot中设置Quartz集群模式非常容易,只需在配置文件中添加以下配置: ``` spring.quartz.job-store-type=jdbc spring.quartz.properties.org.quartz.jobStore.isClustered=true spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=2000 spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO ``` 上面的配置使用Spring Boot将Quartz设置为集群模式,其中“clusterCheckinInterval”指定调度程序检查其他调度程序的频率。在集群中,每个实例都必须被分配一个唯一的实例ID。 八、总结 Quartz调度器是在Java开发中非常流行的开源调度器,Spring Boot Quartz集成可以方便地实现复杂任务调度。在本文中,我们介绍了如何使用Quartz调度器,在Spring Boot应用程序中定义和配置Job和Trigger,以及如何设置Quartz集群模式以避免重复执行任务。 ### 回答3: Springboot是现代Java应用程序的一种框架,负责简化我们在构建Java应用程序时的许多任务。QuartzSpringboot应用程序中的一种定时器,是一个开源的作业调度框架,可以实现多种类型的定时器功能。 在Springboot应用程序中使用Quartz,需要在pom.xml中添加依赖项,并配置定时任务类和定时任务调度器。 首先需要添加Quartz依赖项,在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 接下来创建定时任务类,需要定义一个任务方法,用于定时执行任务。该方法需要添加@Scheduled注释,以告诉Springboot这是一个定时任务。例如: ``` @Component public class MyTask { @Scheduled(fixedRate = 1000) public void mytaskMethod() { System.out.println("定时任务正在执行..."); } } ``` 上述代码中的注释@Scheduled(fixedRate = 1000)意味着该方法将在每秒钟执行一次。可以根据需要调整时间间隔。 最后,需要定义定时任务调度器,负责调度定时任务。在配置类中添加以下内容: ``` @Configuration public class TaskScheduler { @Autowired private MyTask myTask; @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setJobFactory(new SpringBeanJobFactory()); return schedulerFactoryBean; } @Bean public CronTriggerFactoryBean cronTriggerFactoryBean() { CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean(); cronTriggerFactoryBean.setJobDetail(myTask()); cronTriggerFactoryBean.setCronExpression("0/5 * * * * ?"); return cronTriggerFactoryBean; } @Bean public JobDetailFactoryBean myTask() { JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean(); jobDetailFactoryBean.setJobClass(MyTask.class); return jobDetailFactoryBean; } } ``` 上述代码的作用是定义了一个定时任务调度器,并指定了定时任务执行时间和执行类。 综上所述,使用Springboot和Quartz可以轻松创建一个简单的定时任务,并在Springboot应用程序中实现常见的定时器功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值