需求

回到我们的需求:

自动投诉受理:在每个月月底最后一天对本月之前的投诉进行自动处理;将投诉信息的状态改为 已失效。在后台管理中不能对该类型投诉进行回复。

这个需求需求我们要怎么弄呢????要在每个月底最后一天对本月之前的投诉进行自动处理。。。。

记得我们以前在学习Java基础的时候学过了一个Timer这么一个类,可以用规定的频率来执行我们的代码。。。使用起来是非常简单的:

但是呢,要精确到每个月的月底,这就需要我们人为去判断时间了,这就非常不方便了。

因此,我们引入了另一个非常好用的框架:Quartz


Quartz

这是一个优秀的开源任务调度框架“quartz”,可以简单理解成他是Timer的升级版….Spring集成了该框架…

快速入门

我们要使用它,就要导入其开发包:quartz-1.8.6.jar,和Spring对其支持的开发包:org.springframework.context.support-3.0.2.RELEASE

使用它的步骤是十分简单的,可分成三个步骤:

1、制定任务信息 bean

  • ① 设置执行对象
  • ② 设置执行对象中对应的执行方法
  • ③ 是否可以同步执行

2、制定任务执行时机(执行触发器) bean

  • 2.1、简单触发器(SimpleTrigger)

    • ① 设置任务详细
    • ② 设置任务延迟执行时间
    • ③ 设置任务执行频率
  • 2.2、任务触发器(CronTrigger)

    • ① 设置任务详细
    • ② 设置执行时机(cronExpression)
    • cronExpression:秒 分 时 日 月 周 年(可选)

3、设置任务调度工厂 bean

  • 设置触发器们

jobDetail任务详细信息

1、jobDetail 任务详细信息;包括调用哪个类;类中的哪个方法;执行时是否可并行执行任务


<!-- 1、制定任务信息信息 -->
<bean id="jobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 设置执行对象 -->
<property name="targetObject" ref="quartzTask"></property>
<!-- 设置执行对象中对应的执行方法 -->
<property name="targetMethod" value="doSimpleTriggerTask"></property>
<!-- 是否可以同步执行;不可同步执行 -->
<property name="concurrent" value="false"></property>
</bean>
<bean id="jobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 设置执行对象 -->
<property name="targetObject" ref="quartzTask"></property>
<!-- 设置执行对象中对应的执行方法 -->
<property name="targetMethod" value="doCronTriggerTask"></property>
<!-- 是否可以同步执行;不可同步执行 -->
<property name="concurrent" value="false"></property>
</bean>


trigger任务调度触发器

2、trigger 任务调度触发器;主要用于定义jobDetail什么时候执行。触发器最常用的有两种:简单触发器SimpleTrigger 和 任务触发器CronTrigger 。SimpleTrigger和jdk的timer类似,只能指定任务执行以什么样的频率执行,但无法制定精确的执行时间。CronTrigger则既可以执行简单触发器所制定的以频率来执行的时间,也可以制定复杂的时间计划来执行

   <!-- 2、制定任务执行时机(任务执行触发器) -->
<bean id="simplerTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<!-- 设置任务详细 -->
<property name="jobDetail" ref="jobDetail1"></property>
<!-- 设置任务延迟执行时间 ;延迟2秒执行-->
<property name="startDelay" value="2000"></property>
<!-- 设置任务执行频率;执行频率为每4秒执行一下 -->
<property name="repeatInterval" value="2000"></property>
</bean> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!-- 设置任务详细 -->
<property name="jobDetail" ref="jobDetail2"></property>
<!-- 设置任务执行时机,cron表达式 -->
<property name="cronExpression" value="* * * 18c * ?"></property>
</bean>

这里我们着重要了解表达式怎么写:秒 分 时 日 月 周 年【日和周不能同时出现】

  • ’ 字符可以用于所有字段,在“分”字段中设为”“表示”每一分钟”的含义。

  • ‘?’ 字符可以用在“日”和“周几”字段. 它用来指定 ‘不明确的值’. 这在你需要指定这两个字段中的某一个值而不是另外一个的时候会被用到。在后面的例子中可以看到其含义。

  • ‘-’ 字符被用来指定一个值的范围,比如在“小时”字段中设为”10-12”表示”10点到12点”.

  • ‘,’ 字符指定数个值。比如在“周几”字段中设为”MON,WED,FRI”表示”the days Monday, Wednesday, and Friday”.

  • ‘/’ 字符用来指定一个值的的增加幅度. 比如在“秒”字段中设置为”0/15”表示”第0, 15, 30, 和 45秒”。而 “5/15”则表示”第5, 20, 35, 和 50”. 在’/’前加”*”字符相当于指定从0秒开始. 每个字段都有一系列可以开始或结束的数值。对于“秒”和“分”字段来说,其数值范围为0到59,对于“小时”字段来说其为0到23, 对于“日”字段来说为0到31, 而对于“月”字段来说为1到12。”/”字段仅仅只是帮助你在允许的数值范围内从开始”第n”的值。 因此对于“月”字段来说”7/6”只是表示7月被开启而不是“每六个月”, 请注意其中微妙的差别。

  • ‘L’字符可用在“日”和“周几”这两个字段。它是”last”的缩写, 但是在这两个字段中有不同的含义。例如,“日”字段中的”L”表示”一个月中的最后一天” —— 对于一月就是31号对于二月来说就是28号(非闰年)。而在“周几”字段中, 它简单的表示”7” or “SAT”,但是如果在“周几”字段中使用时跟在某个数字之后, 它表示”该月最后一个星期×” —— 比如”6L”表示”该月最后一个周五”。当使用’L’选项时,指定确定的列表或者范围非常重要,否则你会被结果搞糊涂的。

  • ‘W’ 可用于“日”字段。用来指定历给定日期最近的工作日(周一到周五) 。比如你将“日”字段设为”15W”,意为: “离该月15号最近的工作日”。因此如果15号为周六,触发器会在14号即周五调用。如果15号为周日, 触发器会在16号也就是周一触发。如果15号为周二,那么当天就会触发。然而如果你将“日”字段设为”1W”, 而一号又是周六, 触发器会于下周一也就是当月的3号触发,因为它不会越过当月的值的范围边界。’W’字符只能用于“日”字段的值为单独的一天而不是一系列值的时候。

  • ‘L’和’W’可以组合用于“日”字段表示为’LW’,意为”该月最后一个工作日”。

  • ‘#’ 字符可用于“周几”字段。该字符表示“该月第几个周×”,比如”6#3”表示该月第三个周五( 6表示周五而”#3”该月第三个)。再比如: “2#1” = 表示该月第一个周一而 “4#5” = 该月第五个周三。注意如果你指定”#5”该月没有第五个“周×”,该月是不会触发的。

  • ‘C’ 字符可用于“日”和“周几”字段,它是”calendar”的缩写。它表示为基于相关的日历所计算出的值(如果有的话)。如果没有关联的日历, 那它等同于包含全部日历。“日”字段值为”5C”表示”日历中的第一天或者5号及其以后”,“周几”字段值为”1C”则表示”日历中的第一天或者周日及其以后”。

  • 对于“月份”字段和“周几”字段来说合法的字符都不是大小写敏感的。


schedulerFactory 任务调度工厂

schedulerFactory 任务调度工厂;用于调度各个任务触发器。

任务调度工厂可以调度多个任务同时进行


<!-- 3、设置调度工厂 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!-- <ref bean="simplerTrigger"/> -->
<ref bean="cronTrigger"/>
</list>
</property>
</bean>


自动受理

回到我们的需求,我们已经大概了解了Quartz这么一个开源框架使用了。我们就可以在每个月的最后一天中去执行我们对应的代码就行了。

  • 时机:

    • 每个月月底最后一天;cronExpression:10 10 2 L * ?
  • 执行什么内容:
    • 对本月之前的待受理投诉进行自动处理;将投诉信息的状态改为 已失效
  • 如何执行:
    • 本月之前的待受理投诉:select * from Complain where 投诉时间 < 本月1号0时0分0秒

在Spring配置文件中加入Quartz框架….

我们在Service中执行对应的代码


<!-- 1、制定任务信息信息 -->
<bean id="jobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 设置执行对象 -->
<property name="targetObject" ref="complainServiceImpl"></property>
<!-- 设置执行对象中对应的执行方法 -->
<property name="targetMethod" value="doTask"></property>
<!-- 是否可以同步执行;不可同步执行 -->
<property name="concurrent" value="false"></property>
</bean> <!-- 2、制定任务执行时机(任务执行触发器) -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!-- 设置任务详细 -->
<property name="jobDetail" ref="jobDetail1"></property>
<!-- 设置任务执行时机,cron表达式 -->
<property name="cronExpression" value="10 10 2 L * ?"></property>
</bean> <!-- 3、设置调度工厂 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
</list>
</property>
</bean>
</beans>

查询出未处理和是本月前的记录,修改成是失效的。


@Override
public void doTask() { //查询所有待受理的信息
QueryHelper queryHelper = new QueryHelper(Complain.class, "c");
queryHelper.addCondition(" c.state=?", Complain.COMPLAIN_STATE_UNDONE); //只要在本月之前
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
queryHelper.addCondition(" c.compTime <?", calendar.getTime()); //拿到本月之前所有未处理的数据
List<Complain> complains = findObjects(queryHelper); //将数据全部改成是失效的了。
for (Complain complain : complains) {
complain.setState(Complain.COMPLAIN_STATE_INVALID);
}
}
}

如果已经失效了,那么我们就不让管理员对其进行回复了。


<s:if test="state!=2"> <a href="javascript:doDeal('<s:property value='compId'/>')">受理</a></s:if>


纳税服务系统【自动受理,Quartz任务调度】的更多相关文章

  1. 纳税服务系统【信息发布管理、Ueditor、异步信息交互】

    需求分析 我们现在来到了纳税服务系统的信息发布管理模块,首先我们跟着原型图来进行需求分析把: 一些普通的CRUD,值得一做的就是状态之间的切换了.停用和发布切换. 值得注意的是:在信息内容中,它可以带 ...

  2. 纳税服务系统【异常处理、抽取BaseAction】

    前言 本博文主要讲解在项目中异常是怎么处理的.一般我们都不会直接把后台异常信息返回给用户,用户是看不懂的.让用户看见一大串的错误代码,这是不合理的.因此我们需要对报错进行处理. 我们在开发的时候是使用 ...

  3. 纳税服务系统【统计图Fusionchart】

    需求 我们在投诉模块中还有一个功能没有实现: 统计:根据年度将相应年度的每个月的投诉数进行统计,并以图表的形式展示在页面中:在页面中可以选择查看当前年度及其前4年的投诉数.在页面中可以选择不同的年度, ...

  4. 纳税服务系统【抽取BaseService、条件查询】

    抽取BaseService 到目前为止,我们已经写了三个模块的开发了.我们已经抽取过了BaseAction.BaseDao,我们这次来看看我们的Service接口. UserService /** * ...

  5. 纳税服务系统【用户模块之使用POI导入excel、导出excel】

    前言 再次回到我们的用户模块上,我们发现还有两个功能没有完成: 对于将网页中的数据导入或导出到excel文件中,我们是完全没有学习过的.但是呢,在Java中操作excel是相对常用的,因此也有组件供我 ...

  6. Quartz任务调度 服务日志+log4net打印日志+制作windows服务

    引言 现在许多的项目都需要定时的服务进行支撑,而我们经常用到的定时服务就是Quartz任务调度了.不过我们在使用定时Job进行获取的时候,有时候我们就需要记录一下自定义的日志,甚至我们还会对执行定时J ...

  7. Quartz任务调度系统,克隆表达式

    Quartz任务调度系统,克隆表达式 (1).克隆表达式可以包括7个字段:秒.分.小时.月内日期.月.周内日期.年(可选字段) (2).特殊字符: 一.反斜线(/)字符表示增量."5/15& ...

  8. DHCP服务+PXE自动安装系统

    DHCP服务+PXE自动安装系统 DHCP安装 安装DHCP服务器 yum install dhcp -y 安装完dhcp默认无法启动,需要编辑配置文件设置分配地址范围等相关信息,服务器自身IP地址要 ...

  9. 从零开始学 Java - Spring 使用 Quartz 任务调度定时器

    生活的味道 睁开眼看一看窗外的阳光,伸一个懒腰,拿起放在床一旁的水白开水,甜甜的味道,晃着尾巴东张西望的猫猫,在窗台上舞蹈.你向生活微笑,生活也向你微笑. 请你不要询问我的未来,这有些可笑.你问我你是 ...

随机推荐

  1. Redis的部署及使用

    Redis Memcached与Redis的对比 Memcached: 优点: 1. 纯set get性能好 2. 开发都会用,易用简单 4. 可用于存放session 缺点: 1. 不支持持久化 2 ...

  2. 将本地sql文件导入到mysql中

    cmd命令操作:先创建一个同名数据库,然后通过source导入sql文件 1.启动mysql 2.mysql -uroot -p 输入密码运行mysql 3.创建一个同名数据库 create data ...

  3. Google 以图搜图 - 相似图片搜索原理 - Java实现 (转)

    前阵子在阮一峰的博客上看到了这篇<相似图片搜索原理>博客,就有一种冲动要将这些原理实现出来了. Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相 ...

  4. 使用正则移除尖括号<>中的指定子字符串

    "; string input = "dfsdfsd<在OA中申请Annual Leaveaaaa公司年假 1.0天,申请单号1311160122251><在OA ...

  5. 【Hadoop】集群配置要点

    1.SSH免密码登录 1.1生成公钥,一直enter,直到完成 dream361@master:~$ ssh-keygen -t rsa 1.2传送公钥 dream361@master:~$ scp ...

  6. JQuery基础 接下来我将把我最近学习jQuery所做的笔记发布,希望对初学者有些许帮助,也方便自己以后复习

    jQuery简介 1.概念: jQuery是一个优秀的JavaScript库,而非JavaScript.它是轻量级的库2.兼容性:兼容css3,以及各种浏览器.3版本: 1.x-----------兼 ...

  7. 最大流dinic模板

    循环版,点的编号从0开始: ; ; const int INF = 0x3f3f3f3f; struct Edge { int to, next, cap, flow; }edge[MAXM]; in ...

  8. python网络编程(线程)

    一.socketserver模块 之前的例子中的C/S架构只能实现同一时刻只有一台客户端可以和服务端进行数据交互,我们可以通过socketserver模块实现并发. 基于tcp的套接字,关键就是两个循 ...

  9. PHP字符串和数组

    php常用函数和数组 字符串替换 , 分割字符串(字符串转数组),  拼接数组的值(数组组转字符串) , 格式化输出  查找字符首次出现的位置 , 获取字符串长度 以一个数组作为key另一个数组作为v ...

  10. Centos7.2下基于Nginx+Keepalived搭建高可用负载均衡(一.基于Keepalived搭建HA体系)

    说明 本文只为方便日后查阅,不对一些概念再做赘述,网上都有很多明确的解释,也请大家先了解相关概念. 两台搭建HA的服务器是华为云上的ECS(不要忘记开通VPC,保证我们的服务器都处在一个内网环境),由 ...