• 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

  • 相关阅读:
    Spring Cloud Stream 使用延迟消息实现定时任务(RabbitMQ)
    rocketmq发送消息的三种方式
    windows下RocketMQ安装部署
    idea多设备自动同步配置
    idea复制springboot的maven项目后,修改了maven名称,但maven工具里的maven名称没改变,不生效
    SpringBoot图文教程16—SpringBoot 多模块开发「web」「打包」
    spring-boot-starter-parent的作用
    JDK8 从永久代到元空间
    Spring 生命周期
    mesos Failed to connect to
  • 原文地址:https://www.cnblogs.com/haw2106/p/10365748.html
Copyright © 2020-2023  润新知