通过前面的学习,你可能大致了解了Quartz,本篇博文为你打开学习SSMM+Quartz的旅程!欢迎上车,开始美好的旅程!
本篇是在SSM框架基础上进行的。
参考文章:
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控制台打印的信息