精进Quartz—SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(四)

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

当任何时候觉你得难受了,其实你的大脑是在进化,当任何时候你觉得轻松,其实都在使用以前的坏习惯。

通过前面的学习,你可能大致了解了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、项目结构

202002201003\_1.png

3、初始化

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

    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

4、配置文件介绍

4.1 在ApplicationContext.xml中添加下面的配置:

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

202002201003\_2.png

4.2 添加quartz.properties配置文件

    # Default Properties file for use by StdSchedulerFactory
    # to create a Quartz Scheduler Instance, if a different
    # properties file is not explicitly specified.
    #

    #============================================================================
    # Configure Main Scheduler Properties
    #============================================================================
    org.quartz.scheduler.instanceName: quartzScheduler
    org.quartz.scheduler.instanceId = AUTO

    org.quartz.scheduler.rmi.export: false
    org.quartz.scheduler.rmi.proxy: false
    org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
    #============================================================================
    # Configure ThreadPool
    #============================================================================
    org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
    org.quartz.threadPool.threadCount: 2
    org.quartz.threadPool.threadPriority: 5
    org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true

    org.quartz.jobStore.misfireThreshold: 60000
    #============================================================================
    # Configure JobStore
    #============================================================================

    #default config
    #org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
    #持久化配置
    org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX
    org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
    org.quartz.jobStore.useProperties:true

    #============================================================================
    #havent cluster spring
    #============================================================================
    org.quartz.jobStore.isClustered = false  

    #数据库表前缀
    org.quartz.jobStore.tablePrefix:qrtz_
    #org.quartz.jobStore.dataSource:qzDS

    #============================================================================
    # Configure Datasources
    #============================================================================
    #JDBC驱动  Sping去管理dataSource ,这里不在配置数据源信息
    #org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
    #org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/quartz_test
    #org.quartz.dataSource.qzDS.user:root
    #org.quartz.dataSource.qzDS.password:root
    #org.quartz.dataSource.qzDS.maxConnection:10

5、关键代码简单介绍

5.1 过滤器

添加过滤器拦截请求,若用户没有登录,则跳转到登录页面!

a. 新增LoginFilter.java,核心代码如下

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

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

     <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>org.ssm.dufy.filter.LoginFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/</url-pattern>
      </filter-mapping>

5.2BAO和Service接口

Dao主要是用户的一些操作!

    public interface IUserDao {
        int deleteByPrimaryKey(Integer id);

        int insert(User record);

        int insertSelective(User record);

        User selectByPrimaryKey(Integer id);

        int updateByPrimaryKeySelective(User record);

        int updateByPrimaryKey(User record);

        User findUser(User user);
    }

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

    package org.ssm.dufy.service;

    public interface QuartzService {

        /**
         * addJob(方法描述:添加一个定时任务) <br />
         * (方法适用条件描述: – 可选)
         * 
         * @param jobName
         *            作业名称
         * @param jobGroupName
         *            作业组名称
         * @param triggerName
         *            触发器名称
         * @param triggerGroupName
         *            触发器组名称
         * @param cls
         *            定时任务的class
         * @param cron
         *            时间表达式 void
         * @exception
         * @since 1.0.0
         */
        public void addJob(String jobName, String jobGroupName,String triggerName, String triggerGroupName, Class cls, String cron);

        /**
         * 
         * @param oldjobName 原job name
         * @param oldjobGroup 原job group
         * @param oldtriggerName 原 trigger name
         * @param oldtriggerGroup 原 trigger group
         * @param jobName
         * @param jobGroup
         * @param triggerName
         * @param triggerGroup
         * @param cron
         */
        public boolean modifyJobTime(String oldjobName,String oldjobGroup, String oldtriggerName, String oldtriggerGroup, String jobName, String jobGroup,String triggerName, String triggerGroup, String cron);

        /**
         * 修改触发器调度时间
         * @param triggerName  触发器名称
         * @param triggerGroupName  触发器组名称
         * @param cron cron表达式
         */
        public void modifyJobTime(String triggerName,
                String triggerGroupName, String cron);

        /**
         * 暂停指定的任务
         * @param jobName 任务名称
         * @param jobGroupName 任务组名称 
         * @return
         */
        public void pauseJob(String jobName,String jobGroupName);

        /**
         * 恢复指定的任务
         * @param jobName 任务名称
         * @param jobGroupName 任务组名称 
         * @return
         */
        public void resumeJob(String jobName,String jobGroupName);

        /**
         * 删除指定组任务
         * @param jobName 作业名称
         * @param jobGroupName 作业组名称
         * @param triggerName 触发器名称
         * @param triggerGroupName 触发器组名称
         */
        public void removeJob(String jobName, String jobGroupName,
                String triggerName, String triggerGroupName);

        /**
         * 开始所有定时任务。启动调度器
         */
        public void startSchedule();

        /**
         * 关闭调度器
         */
        public void shutdownSchedule();
    }

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

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

5.3 Controller

(1):UserController

处理一些用户的请求操作!

(2):QuartzController

处理Quartz的请求操作!

6、任务类

    package org.ssm.dufy.job;

    import java.util.Date;

    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;

    public class HelloWorldJob implements Job{

        /**
         * "0/5 * * * * ?  五秒运行一次 
         */
        @Override
        public void execute(JobExecutionContext arg0) throws JobExecutionException {
            System.out.println("----hello world---" + new Date());
        }

    }

7、待优化地方

  • 界面的美观性
  • 可以添加Simple类型的Trigger
  • 用户信息的管理
  • 抽象Job的Dao类
    。。。。。。

三、运行效果介绍

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

    <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.4</version>
                </plugin>
                <plugin>
                    <groupId>org.mortbay.jetty</groupId>
                    <artifactId>jetty-maven-plugin</artifactId>
                    <version>8.1.15.v20140411</version>

                    <configuration>
                        <scanIntervalSeconds>10</scanIntervalSeconds>
                        <stopPort>9999</stopPort>
                        <reload>manual</reload>
                        <webAppConfig>
                            <contextPath>/ssm_quratz</contextPath>
                        </webAppConfig>
                        <connectors>
                            <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
                                <port>8080</port>
                                <maxIdleTime>60000</maxIdleTime>
                            </connector>
                        </connectors>
                    </configuration>
                </plugin>

在Eclipse运行步骤如在截图:

202002201003\_3.png

配置的参数

    -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

运行结果图
第一 :登录页面

202002201003\_4.png

第二:任务列表页面

202002201003\_5.png

第三:新增页面(编辑页面和此类似)

202002201003\_6.png

第四:Eclipse控制台打印的信息

202002201003\_7.png

四、总结和源码

从前面的系列学习过来,那本文就是一个简单的实战,根据实际的项目和一些简单的案例进行讲解,Quartz掌握到这里,基本上企业级开发也能够应付了,后续持续学习,精进Quartz的源码!

源码:SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成 源码

Quartz专栏系列

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处理规则(四)


谢谢你的阅读,如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到!祝你每天开心愉快!


不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

博客首页 : http://blog.csdn.net/u010648555

愿你我在人生的路上能都变成最好的自己,能够成为一个独挡一面的人
202002201003\_8.png

© 每天都在变得更好的阿飞云


来源:https://blog.csdn.net/u010648555/column/info/14251

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » 精进Quartz—SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(四)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏