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"));
}