通过前面的学习,你可能大致了解了Quartz,本篇博文为你打开学习SSMM+Quartz的旅程!欢迎上车,开始美好的旅程!
本篇是在SSM框架——Spring+SpringMVC+Mybatis的搭建教程这篇为基础上进行的,如果不了解SSM搭建请先点击闪现到查看详情:闪现
一:环境介绍
工具:Eclipse+ Mysql
框架:Spring+SpringMVC+Mybatis
日志:logback
构建工具:Maven
单元测试:Junit4
Quartz版本:2.2.1
二:SSMM+Quartz集成详解
1:概述
在之前SSM框架的基础集合Quartz写一个简单的Web项目,实现Quartz的动态添加,修改和删除功能!(这里只是对Cron类型的Trigger进行操作)
2:项目结构
3:初始化
在项目中找到初始化sql——quartz_test.sql ,导入自己的数据库中!初始化的表信息如下:
<span style="color:#000000"><code>qrtz_blob_triggers,
qrtz_calendars,
qrtz_fired_triggers,
qrtz_locks,
qrtz_paused_trigger_grps,
qrtz_scheduler_state,
qrtz_simple_triggers,
qrtz_simprop_triggers,
qrtz_triggers,
user_t</code></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
4:配置文件介绍
(1):在ApplicationContext.xml中添加下面的配置:
<span style="color:#000000"><code><bean name=<span style="color:#009900">"quartzScheduler"</span> class=<span style="color:#009900">"org.springframework.scheduling.quartz.SchedulerFactoryBean"</span> >
<<span style="color:#000088">property</span> name=<span style="color:#009900">"dataSource"</span> <span style="color:#000088">ref</span> =<span style="color:#009900">"dataSource"</span> />
<<span style="color:#000088">property</span> name=<span style="color:#009900">"applicationContextSchedulerContextKey"</span> value=<span style="color:#009900">"applicationContextKey"</span>/>
<<span style="color:#000088">property</span> name=<span style="color:#009900">"configLocation"</span> value=<span style="color:#009900">"classpath:quartz.properties"</span>/>
</bean></code></span>
- 1
- 2
- 3
- 4
- 5
(2):添加quartz.properties配置文件
<span style="color:#000000"><code><span style="color:#009900"># Default Properties file for use by StdSchedulerFactory</span>
<span style="color:#009900"># to create a Quartz Scheduler Instance, if a different</span>
<span style="color:#009900"># properties file is not explicitly specified.</span>
<span style="color:#009900">#</span>
<span style="color:#009900">#============================================================================</span>
<span style="color:#009900"># Configure Main Scheduler Properties</span>
<span style="color:#009900">#============================================================================</span>
org.quartz.scheduler.instanceName: quartzScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export: <span style="color:#006666">false</span>
org.quartz.scheduler.rmi.proxy: <span style="color:#006666">false</span>
org.quartz.scheduler.wrapJobExecutionInUserTransaction: <span style="color:#006666">false</span>
<span style="color:#009900">#============================================================================</span>
<span style="color:#009900"># Configure ThreadPool</span>
<span style="color:#009900">#============================================================================</span>
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: <span style="color:#006666">2</span>
org.quartz.threadPool.threadPriority: <span style="color:#006666">5</span>
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: <span style="color:#006666">true</span>
org.quartz.jobStore.misfireThreshold: <span style="color:#006666">60000</span>
<span style="color:#009900">#============================================================================</span>
<span style="color:#009900"># Configure JobStore</span>
<span style="color:#009900">#============================================================================</span>
<span style="color:#009900">#default config</span>
<span style="color:#009900">#org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore</span>
<span style="color:#009900">#持久化配置</span>
org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties:<span style="color:#006666">true</span>
<span style="color:#009900">#============================================================================</span>
<span style="color:#009900">#havent cluster spring</span>
<span style="color:#009900">#============================================================================</span>
org.quartz.jobStore.isClustered = <span style="color:#006666">false</span>
<span style="color:#009900">#数据库表前缀</span>
org.quartz.jobStore.tablePrefix:qrtz_
<span style="color:#009900">#org.quartz.jobStore.dataSource:qzDS</span>
<span style="color:#009900">#============================================================================</span>
<span style="color:#009900"># Configure Datasources</span>
<span style="color:#009900">#============================================================================</span>
<span style="color:#009900">#JDBC驱动 Sping去管理dataSource ,这里不在配置数据源信息</span>
<span style="color:#009900">#org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver</span>
<span style="color:#009900">#org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/quartz_test</span>
<span style="color:#009900">#org.quartz.dataSource.qzDS.user:root</span>
<span style="color:#009900">#org.quartz.dataSource.qzDS.password:root</span>
<span style="color:#009900">#org.quartz.dataSource.qzDS.maxConnection:10</span></code></span>
- 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
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
5:关键代码简单介绍
(1):过滤器
添加过滤器拦截请求,若用户没有登录,则跳转到登录页面!
a. 新增LoginFilter.java,核心代码如下:
<span style="color:#000000"><code> <span style="color:#9b859d">@Override</span>
<span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">doFilter</span>(ServletRequest req, ServletResponse resp, FilterChain chain) <span style="color:#000088">throws</span> IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
HttpSession session = request.getSession();
<span style="color:#880000">//判断Session中是否有登录用户信息</span>
String toke = (String) session.getAttribute(CommonConstant.LONGIN_TOKE);
<span style="color:#000088">if</span>(!StringUtils.isEmpty(toke)){
chain.doFilter(req, resp);
}<span style="color:#000088">else</span>{
<span style="color:#880000">//若没有则,跳转到登录页面</span>
response.sendRedirect(request.getContextPath() + <span style="color:#009900">"/user/toLogin"</span>);
}
}</code></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
b.在web.xml配置过滤器:
<span style="color:#000000"><code> <<span style="color:#4f4f4f">filter</span>>
<<span style="color:#4f4f4f">filter</span>-name>LoginFilter</<span style="color:#4f4f4f">filter</span>-name>
<<span style="color:#4f4f4f">filter</span>-<span style="color:#000088">class</span>>org.ssm.dufy.<span style="color:#4f4f4f">filter</span>.LoginFilter</<span style="color:#4f4f4f">filter</span>-<span style="color:#000088">class</span>>
</<span style="color:#4f4f4f">filter</span>>
<<span style="color:#4f4f4f">filter</span>-mapping>
<<span style="color:#4f4f4f">filter</span>-name>LoginFilter</<span style="color:#4f4f4f">filter</span>-name>
<url-pattern>/</url-pattern>
</<span style="color:#4f4f4f">filter</span>-mapping></code></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
(2)BAO和Service接口
Dao主要是用户的一些操作!
<span style="color:#000000"><code><span style="color:#000088">public</span> <span style="color:#000088">interface</span> IUserDao {
<span style="color:#000088">int</span> deleteByPrimaryKey(Integer id);
<span style="color:#000088">int</span> insert(User record);
<span style="color:#000088">int</span> insertSelective(User record);
User selectByPrimaryKey(Integer id);
<span style="color:#000088">int</span> updateByPrimaryKeySelective(User record);
<span style="color:#000088">int</span> updateByPrimaryKey(User record);
User findUser(User user);
}</code></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
Service主要是对定时任务的一些操作!
<span style="color:#000000"><code><span style="color:#000088">package</span> org.ssm.dufy.service;
<span style="color:#000088">public</span> <span style="color:#000088">interface</span> <span style="color:#4f4f4f">QuartzService</span> {
<span style="color:#880000">/**
* addJob(方法描述:添加一个定时任务) <br />
* (方法适用条件描述: – 可选)
*
*<span style="color:#4f4f4f"> @param</span> jobName
* 作业名称
*<span style="color:#4f4f4f"> @param</span> jobGroupName
* 作业组名称
*<span style="color:#4f4f4f"> @param</span> triggerName
* 触发器名称
*<span style="color:#4f4f4f"> @param</span> triggerGroupName
* 触发器组名称
*<span style="color:#4f4f4f"> @param</span> cls
* 定时任务的class
*<span style="color:#4f4f4f"> @param</span> cron
* 时间表达式 void
*<span style="color:#4f4f4f"> @exception</span>
*<span style="color:#4f4f4f"> @since</span> 1.0.0
*/</span>
<span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">addJob</span>(String jobName, String jobGroupName,String triggerName, String triggerGroupName, Class cls, String cron);
<span style="color:#880000">/**
*
*<span style="color:#4f4f4f"> @param</span> oldjobName 原job name
*<span style="color:#4f4f4f"> @param</span> oldjobGroup 原job group
*<span style="color:#4f4f4f"> @param</span> oldtriggerName 原 trigger name
*<span style="color:#4f4f4f"> @param</span> oldtriggerGroup 原 trigger group
*<span style="color:#4f4f4f"> @param</span> jobName
*<span style="color:#4f4f4f"> @param</span> jobGroup
*<span style="color:#4f4f4f"> @param</span> triggerName
*<span style="color:#4f4f4f"> @param</span> triggerGroup
*<span style="color:#4f4f4f"> @param</span> cron
*/</span>
<span style="color:#000088">public</span> <span style="color:#000088">boolean</span> <span style="color:#009900">modifyJobTime</span>(String oldjobName,String oldjobGroup, String oldtriggerName, String oldtriggerGroup, String jobName, String jobGroup,String triggerName, String triggerGroup, String cron);
<span style="color:#880000">/**
* 修改触发器调度时间
*<span style="color:#4f4f4f"> @param</span> triggerName 触发器名称
*<span style="color:#4f4f4f"> @param</span> triggerGroupName 触发器组名称
*<span style="color:#4f4f4f"> @param</span> cron cron表达式
*/</span>
<span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">modifyJobTime</span>(String triggerName,
String triggerGroupName, String cron);
<span style="color:#880000">/**
* 暂停指定的任务
*<span style="color:#4f4f4f"> @param</span> jobName 任务名称
*<span style="color:#4f4f4f"> @param</span> jobGroupName 任务组名称
*<span style="color:#4f4f4f"> @return</span>
*/</span>
<span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">pauseJob</span>(String jobName,String jobGroupName);
<span style="color:#880000">/**
* 恢复指定的任务
*<span style="color:#4f4f4f"> @param</span> jobName 任务名称
*<span style="color:#4f4f4f"> @param</span> jobGroupName 任务组名称
*<span style="color:#4f4f4f"> @return</span>
*/</span>
<span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">resumeJob</span>(String jobName,String jobGroupName);
<span style="color:#880000">/**
* 删除指定组任务
*<span style="color:#4f4f4f"> @param</span> jobName 作业名称
*<span style="color:#4f4f4f"> @param</span> jobGroupName 作业组名称
*<span style="color:#4f4f4f"> @param</span> triggerName 触发器名称
*<span style="color:#4f4f4f"> @param</span> triggerGroupName 触发器组名称
*/</span>
<span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">removeJob</span>(String jobName, String jobGroupName,
String triggerName, String triggerGroupName);
<span style="color:#880000">/**
* 开始所有定时任务。启动调度器
*/</span>
<span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">startSchedule</span>();
<span style="color:#880000">/**
* 关闭调度器
*/</span>
<span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">shutdownSchedule</span>();
}
</code></span>
- 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
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
操作用户通过Mybatis进行,操作定时器任务,使用的Quartz封装好的接口!
主要的实现代码就不在这里展示!如需查看请看源码!
(3)Controller
(1):UserController
处理一些用户的请求操作!
(2):QuartzController
处理Quartz的请求操作!
6:任务类
<span style="color:#000000"><code><span style="color:#000088">package</span> org.ssm.dufy.job;
<span style="color:#000088">import</span> java.util.Date;
<span style="color:#000088">import</span> org.quartz.Job;
<span style="color:#000088">import</span> org.quartz.JobExecutionContext;
<span style="color:#000088">import</span> org.quartz.JobExecutionException;
<span style="color:#000088">public</span> <span style="color:#000088">class</span> <span style="color:#4f4f4f">HelloWorldJob</span> <span style="color:#000088">implements</span> <span style="color:#4f4f4f">Job</span>{
<span style="color:#880000">/**
* "0/5 * * * * ? 五秒运行一次
*/</span>
<span style="color:#9b859d">@Override</span>
<span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">execute</span>(JobExecutionContext arg0) <span style="color:#000088">throws</span> JobExecutionException {
System.out.println(<span style="color:#009900">"----hello world---"</span> + <span style="color:#000088">new</span> Date());
}
}
</code></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
7:待优化地方
- 界面的美观性
- 可以添加Simple类型的Trigger
- 用户信息的管理
- 抽象Job的Dao类
。。。。。。
三:运行效果介绍
有两种方式启动本实例项目:
1:Tomcat方式,Tomcat方式不在讲解!
2:Jetty方式
在pom.xml中配置了Jetty的依赖的插件!
<span style="color:#000000"><code><span style="color:#006666"><<span style="color:#4f4f4f">plugin</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">groupId</span>></span>org.apache.maven.plugins<span style="color:#006666"></<span style="color:#4f4f4f">groupId</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">artifactId</span>></span>maven-war-plugin<span style="color:#006666"></<span style="color:#4f4f4f">artifactId</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">version</span>></span>2.4<span style="color:#006666"></<span style="color:#4f4f4f">version</span>></span>
<span style="color:#006666"></<span style="color:#4f4f4f">plugin</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">plugin</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">groupId</span>></span>org.mortbay.jetty<span style="color:#006666"></<span style="color:#4f4f4f">groupId</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">artifactId</span>></span>jetty-maven-plugin<span style="color:#006666"></<span style="color:#4f4f4f">artifactId</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">version</span>></span>8.1.15.v20140411<span style="color:#006666"></<span style="color:#4f4f4f">version</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">configuration</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">scanIntervalSeconds</span>></span>10<span style="color:#006666"></<span style="color:#4f4f4f">scanIntervalSeconds</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">stopPort</span>></span>9999<span style="color:#006666"></<span style="color:#4f4f4f">stopPort</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">reload</span>></span>manual<span style="color:#006666"></<span style="color:#4f4f4f">reload</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">webAppConfig</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">contextPath</span>></span>/ssm_quratz<span style="color:#006666"></<span style="color:#4f4f4f">contextPath</span>></span>
<span style="color:#006666"></<span style="color:#4f4f4f">webAppConfig</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">connectors</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">connector</span> <span style="color:#4f4f4f">implementation</span>=<span style="color:#009900">"org.eclipse.jetty.server.nio.SelectChannelConnector"</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">port</span>></span>8080<span style="color:#006666"></<span style="color:#4f4f4f">port</span>></span>
<span style="color:#006666"><<span style="color:#4f4f4f">maxIdleTime</span>></span>60000<span style="color:#006666"></<span style="color:#4f4f4f">maxIdleTime</span>></span>
<span style="color:#006666"></<span style="color:#4f4f4f">connector</span>></span>
<span style="color:#006666"></<span style="color:#4f4f4f">connectors</span>></span>
<span style="color:#006666"></<span style="color:#4f4f4f">configuration</span>></span>
<span style="color:#006666"></<span style="color:#4f4f4f">plugin</span>></span></code></span>
- 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
在Eclipse运行步骤如在截图:
配置的参数:
<span style="color:#000000"><code>-server -<span style="color:#009900">Xms1024m</span> -<span style="color:#009900">Xmx2048m</span> -<span style="color:#009900">XX</span><span style="color:#009900">:PermSize=</span><span style="color:#006666">512</span>m -<span style="color:#009900">XX</span><span style="color:#009900">:MaxPermSize=</span><span style="color:#006666">512</span>m -<span style="color:#009900">XX</span><span style="color:#009900">:+CMSClassUnloadingEnabled</span> -<span style="color:#009900">XX</span><span style="color:#009900">:+PrintGCDetails</span> -<span style="color:#009900">Xloggc</span><span style="color:#009900">:%M2_HOME<span style="color:#009900">%/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%M2_HOME%/</span>java_pid</span>.hproyuan</code></span>
- 1
配置好之后运行启动不报错就ok!
最后打开浏览器,输入 http://localhost:8080/ssm_quratz
3:运行结果图
(1)登录页面
(2)任务列表页面
(3)新增页面(编辑页面和此类似)
(4)Eclipse控制台打印的信息
四:源码
SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成 源码
Quartz专栏系列
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处理规则(四)
原文地址:https://blog.csdn.net/u010648555/article/details/60767633