Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(转)

通过前面的学习,你可能大致了解了Quartz,本篇博文为你打开学习SSMM+Quartz的旅程!欢迎上车,开始美好的旅程! 
本篇是在SSM框架基础上进行的。

参考文章:

1.Quartz学习——Quartz大致介绍(一)

2.Quartz学习——Quartz简单入门Demo(二)

3.Quartz学习——Spring和Quartz集成详解(三)

4.Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(四)

5.Quartz源码——JobStore保存JonDetail和Trigger源码分析(一)

6.Quartz源码——scheduler.start()启动源码分析(二)

7.Quartz源码——QuartzSchedulerThread.run() 源码分析(三)

8.Quartz源码——Quartz调度器的Misfire处理规则(四)

 

一:环境介绍

工具:Eclipse+ Mysql 
框架:Spring+SpringMVC+Mybatis 
日志:logback 
构建工具:Maven 
Quartz版本:2.2.1

二:SSMM+Quartz集成详解

1:概述

在之前SSM框架的基础集合Quartz写一个简单的Web项目,实现Quartz的动态添加,修改和删除功能!(这里只是对Cron类型的Trigger进行操作)

2:项目结构

 

3:初始化

在项目中找到初始化sql——quartz_test.sql ,导入自己的数据库中!初始化的表信息如下:

 1 qrtz_blob_triggers,
 2 qrtz_calendars, 
 3 qrtz_fired_triggers, 
 4 qrtz_locks, 
 5 qrtz_paused_trigger_grps, 
 6 qrtz_scheduler_state, 
 7 qrtz_simple_triggers, 
 8 qrtz_simprop_triggers,
 9 qrtz_triggers, 
10 user_t

 

4:配置文件介绍

(1):在ApplicationContext.xml中添加下面的配置:

1 <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
2         <property name="dataSource" ref ="dataSource" />       
3         <property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>
4         <property name="configLocation" value="classpath:quartz.properties"/>           
5     </bean>

 

 (2):添加quartz.properties配置文件

 1 # Default Properties file for use by StdSchedulerFactory
 2 # to create a Quartz Scheduler Instance, if a different
 3 # properties file is not explicitly specified.
 4 #
 5 
 6 #============================================================================
 7 # Configure Main Scheduler Properties
 8 #============================================================================
 9 org.quartz.scheduler.instanceName: quartzScheduler
10 org.quartz.scheduler.instanceId = AUTO
11 
12 org.quartz.scheduler.rmi.export: false
13 org.quartz.scheduler.rmi.proxy: false
14 org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
15 #============================================================================
16 # Configure ThreadPool
17 #============================================================================
18 org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
19 org.quartz.threadPool.threadCount: 2
20 org.quartz.threadPool.threadPriority: 5
21 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
22 
23 org.quartz.jobStore.misfireThreshold: 60000
24 #============================================================================
25 # Configure JobStore
26 #============================================================================
27 
28 #default config
29 #org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
30 #持久化配置
31 org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX
32 org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
33 org.quartz.jobStore.useProperties:true
34 
35 #============================================================================
36 #havent cluster spring
37 #============================================================================
38 org.quartz.jobStore.isClustered = false  
39 
40 #数据库表前缀
41 org.quartz.jobStore.tablePrefix:qrtz_
42 #org.quartz.jobStore.dataSource:qzDS
43 
44 #============================================================================
45 # Configure Datasources
46 #============================================================================
47 #JDBC驱动  Sping去管理dataSource ,这里不在配置数据源信息
48 #org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
49 #org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/quartz_test
50 #org.quartz.dataSource.qzDS.user:root
51 #org.quartz.dataSource.qzDS.password:root
52 #org.quartz.dataSource.qzDS.maxConnection:10

5:关键代码简单介绍

(1):过滤器 
添加过滤器拦截请求,若用户没有登录,则跳转到登录页面! 
a. 新增LoginFilter.java,核心代码如下:

 1     @Override
 2     public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
 3         HttpServletRequest request = (HttpServletRequest) req;
 4         HttpServletResponse response = (HttpServletResponse) resp;
 5         HttpSession session = request.getSession();
 6         //判断Session中是否有登录用户信息
 7         String toke = (String) session.getAttribute(CommonConstant.LONGIN_TOKE);
 8         if(!StringUtils.isEmpty(toke)){
 9             chain.doFilter(req, resp);
10         }else{
11             //若没有则,跳转到登录页面
12             response.sendRedirect(request.getContextPath() + "/user/toLogin");
13         }
14     }

b.在web.xml配置过滤器:

1 <filter>
2     <filter-name>LoginFilter</filter-name>
3     <filter-class>org.ssm.dufy.filter.LoginFilter</filter-class>
4   </filter>
5   <filter-mapping>
6     <filter-name>LoginFilter</filter-name>
7     <url-pattern>/</url-pattern>
8   </filter-mapping>

(2)BAO和Service接口 
Dao主要是用户的一些操作

 1 public interface IUserDao {
 2     int deleteByPrimaryKey(Integer id);
 3 
 4     int insert(User record);
 5 
 6     int insertSelective(User record);
 7 
 8     User selectByPrimaryKey(Integer id);
 9 
10     int updateByPrimaryKeySelective(User record);
11 
12     int updateByPrimaryKey(User record);
13 
14     User findUser(User user);
15 }

Service主要是对定时任务的一些操作!

 1 package org.ssm.dufy.service;
 2 
 3 public interface QuartzService {
 4 
 5     /**
 6      * addJob(方法描述:添加一个定时任务) <br />
 7      * (方法适用条件描述: – 可选)
 8      * 
 9      * @param jobName
10      *            作业名称
11      * @param jobGroupName
12      *            作业组名称
13      * @param triggerName
14      *            触发器名称
15      * @param triggerGroupName
16      *            触发器组名称
17      * @param cls
18      *            定时任务的class
19      * @param cron
20      *            时间表达式 void
21      * @exception
22      * @since 1.0.0
23      */
24     public void addJob(String jobName, String jobGroupName,String triggerName, String triggerGroupName, Class cls, String cron);
25 
26     /**
27      * 
28      * @param oldjobName 原job name
29      * @param oldjobGroup 原job group
30      * @param oldtriggerName 原 trigger name
31      * @param oldtriggerGroup 原 trigger group
32      * @param jobName
33      * @param jobGroup
34      * @param triggerName
35      * @param triggerGroup
36      * @param cron
37      */
38     public boolean modifyJobTime(String oldjobName,String oldjobGroup, String oldtriggerName, String oldtriggerGroup, String jobName, String jobGroup,String triggerName, String triggerGroup, String cron);
39 
40     /**
41      * 修改触发器调度时间
42      * @param triggerName  触发器名称
43      * @param triggerGroupName  触发器组名称
44      * @param cron cron表达式
45      */
46     public void modifyJobTime(String triggerName,
47             String triggerGroupName, String cron);
48 
49 
50     /**
51      * 暂停指定的任务
52      * @param jobName 任务名称
53      * @param jobGroupName 任务组名称 
54      * @return
55      */
56     public void pauseJob(String jobName,String jobGroupName);
57 
58     /**
59      * 恢复指定的任务
60      * @param jobName 任务名称
61      * @param jobGroupName 任务组名称 
62      * @return
63      */
64     public void resumeJob(String jobName,String jobGroupName);
65 
66     /**
67      * 删除指定组任务
68      * @param jobName 作业名称
69      * @param jobGroupName 作业组名称
70      * @param triggerName 触发器名称
71      * @param triggerGroupName 触发器组名称
72      */
73     public void removeJob(String jobName, String jobGroupName,
74             String triggerName, String triggerGroupName);
75 
76 
77     /**
78      * 开始所有定时任务。启动调度器
79      */
80     public void startSchedule();
81 
82     /**
83      * 关闭调度器
84      */
85     public void shutdownSchedule();
86 }

操作用户通过Mybatis进行,操作定时器任务,使用的Quartz封装好的接口!

主要的实现代码就不在这里展示!如需查看请看源码!

(3)Controller 
   UserController    处理一些用户的请求操作!

  QuartzController   处理Quartz的请求操作!

6:任务类

 1 package org.ssm.dufy.job;
 2 
 3 import java.util.Date;
 4 
 5 import org.quartz.Job;
 6 import org.quartz.JobExecutionContext;
 7 import org.quartz.JobExecutionException;
 8 
 9 public class HelloWorldJob implements Job{
10 
11 
12     /**
13      * "0/5 * * * * ?  五秒运行一次 
14      */
15     @Override
16     public void execute(JobExecutionContext arg0) throws JobExecutionException {
17         System.out.println("----hello world---" + new Date());
18     }
19 
20 }

 

三:运行效果介绍

有两种方式启动本实例项目: 
1:Tomcat方式,Tomcat方式不在讲解! 
2:Jetty方式 
在pom.xml中配置了Jetty的依赖的插件!

 1 <plugin>
 2                 <groupId>org.apache.maven.plugins</groupId>
 3                 <artifactId>maven-war-plugin</artifactId>
 4                 <version>2.4</version>
 5             </plugin>
 6             <plugin>
 7                 <groupId>org.mortbay.jetty</groupId>
 8                 <artifactId>jetty-maven-plugin</artifactId>
 9                 <version>8.1.15.v20140411</version>
10 
11                 <configuration>
12                     <scanIntervalSeconds>10</scanIntervalSeconds>
13                     <stopPort>9999</stopPort>
14                     <reload>manual</reload>
15                     <webAppConfig>
16                         <contextPath>/ssm_quratz</contextPath>
17                     </webAppConfig>
18                     <connectors>
19                         <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
20                             <port>8080</port>
21                             <maxIdleTime>60000</maxIdleTime>
22                         </connector>
23                     </connectors>
24                 </configuration>
25             </plugin>

在Eclipse运行步骤如在截图:

配置的参数:

-server -Xms1024m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+CMSClassUnloadingEnabled -XX:+PrintGCDetails -Xloggc:%M2_HOME%/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%M2_HOME%/java_pid.hproyuan

配置好之后运行启动不报错就ok!

最后打开浏览器,输入 http://localhost:8080/ssm_quratz

 

3:运行结果图 
(1)登录页面

 

(2)任务列表页面

(3)新增页面(编辑页面和此类似)

(4)Eclipse控制台打印的信息

 

四:源码     我的网盘/java/demo/quartz定时器demo

posted @ 2019-02-12 16:35  haw2106  阅读(418)  评论(0编辑  收藏  举报