这是一篇关于在spring框架中使用quarts项目的教程,刚刚在项目中完成了相关功能的实现,所以写这篇文件以记录与分享为目的,也方便自己以后需要时查询。

大概功能模块是,实现动态为多个门对象设置定时器,考虑到可能出现对同一个门进行多次定时器参数的修改,决定以一个门对应一个trigger的方式来实现配置,因为每个门都做同一个任务所以这些trigger共用一个jobdetail对象即可。

首先在spring配置文件中配置一个jobDetail对象:

<bean name="quartststTask" class="org.springframework.scheduling.quartz.JobDetailBean">
        <property name="jobClass" value="com.zk.acc.bean.QuartsTst"></property>
   </bean>

由于采用动态设置trigger对象,所以在配置文件中不配置trigger对象,只配置了一个SchedulerFactoryBean,用于等下在代码中动态往这个SchedulerFactoryBean中添加trigger对象:

<bean name="txt"  class= "org.springframework.scheduling.quartz.SchedulerFactoryBean" scope="singleton">
      <property name="triggers">
        <list>
          <!--    此处可以设置trigger对象,但我们默认为空  -->
        </list>
      </property>
    </bean>

接着配置一个bean用于实现具体操作,需要将SchedulerFactoryBean对象注入

<bean id="test" class="com.zk.acc.web.AccQuartsTestAction">
      <property name="scheduler" ref="txt"></property>
     </bean>

这是action文件中的具体实现方法:

public String setQuarts() throws SchedulerException{

用于确保schedule对象一定要存在,

//System.out.println("appConfig.getProperty"+appConfig.getProperty("acc.doorStart"));
        Resource rs = new FileSystemResource("...src/main/resources/conf/applicationContext-acc.xml");

@SuppressWarnings("deprecation")
        BeanFactory factory = new XmlBeanFactory(rs);
        if(scheduler==null){
            scheduler = (Scheduler) factory.getBean("txt");
        }

获取用户界面选择的doorid参数,多个门id用“,”分隔故:

String checkedDoorIdArr[] = ids.split(",");//被选中的门的id
 String strAry[] = time1.split(":");//用于某一次批量设置的CronExpression参数

String pushTime = "0 "+strAry[1]+" "+strAry[0]+“ ”+" ? * *";

获取spring配置文件中配置的jobdetail

JobDetail jdDetail = (JobDetail) factory.getBean("quartststTask");

最后是判断schedule中trigger与动态配置trigger的流程

CronTriggerBean trigger;
        for(String str:checkedDoorIdArr){//根据门的数量动态设置触发器的数量
            try
            {
                trigger = new CronTriggerBean(); //动态设置trigger对象
                JobDataMap jdMap = trigger.getJobDataMap(); //定义一个jobdatamap用于存储参数
                jdMap.put("doorId", str);
                trigger.setBeanName(str);
                trigger.setName(str);
                trigger.setGroup(Scheduler.DEFAULT_GROUP);
                
                trigger.setJobName(jdDetail.getName());
               
                
                try
                {
                    trigger.setCronExpression(pushTime);//设置用户输入的某个门定时器执行时间
                   
                    String originConExpression = trigger.getCronExpression();
                    System.out.println(originConExpression+"11111111111");
                    System.out.println(scheduler.getTrigger(str, scheduler.DEFAULT_GROUP));
                    System.out.println(scheduler.getJobNames(scheduler.DEFAULT_GROUP).length);
                    //Trigger str1[] = scheduler.getTriggersOfJob(jdDetail.getName(), jdDetail.getGroup());
                    if("".equals(scheduler.getTrigger(str, scheduler.DEFAULT_GROUP))||scheduler.getTrigger(str, scheduler.DEFAULT_GROUP)==null){
                        //如果某个触发器trigger对象在schedul中不存在,也就是在这里进行新加操作

if(scheduler.getJobNames(scheduler.DEFAULT_GROUP).length>0){//判断jobdetail对象是否已经存在在schedule中
                            //如果已经存在,只需要新加trigger
                            scheduler.scheduleJob(trigger);
                        }else{
                            //如果不存在,则需要绑定jobdetail对象到schedule中去
                            scheduler.scheduleJob(jdDetail,trigger);
                        }
                        //scheduler.scheduleJob(jdDetail,trigger);
                        //scheduler.start();
                        
                    }else{//如果该trigger已经存在在schedule中的情况下(即再次对某个门从新设置触发时间的情况),就只是重置schedule中的这个trigger对象
                        System.out.println("triggername为"+str+"已存在!!重置该trigger");
                        scheduler.rescheduleJob(str, Scheduler.DEFAULT_GROUP, trigger);
                        System.out.println(scheduler.getTrigger(str, scheduler.DEFAULT_GROUP));
                        System.out.println(scheduler.getJobNames(scheduler.DEFAULT_GROUP).length);
//                        Trigger str1[] = scheduler.getTriggersOfJob(jdDetail.getName(), jdDetail.getGroup());
                    }
                    
                }
                catch (Exception e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            
        }

spring中使用quarts实现任务定制与管理相关推荐

  1. [原创] 在spring 中使用quarts

    1.使用maven加载 quarts 的jar 1 <dependency> 2 <groupId>org.quartz-scheduler</groupId> 3 ...

  2. 在Spring中使用JTA事务管理

    在Spring中使用JTA事务管理 Spring 通过AOP技术可以让我们在脱离EJB的情况下享受声明式事务的丰盛大餐,脱离Java EE应用服务器使用声明式事务的道路已经畅通无阻.但是很大部分人都还 ...

  3. 在Spring中使用JOTM实现JTA事务管理

    Spring 通过AOP技术可以让我们在脱离EJB的情况下享受声明式事务的丰盛大餐,脱离Java EE应用服务器使用声明式事务的道路已经畅通无阻.但是很大部分人都还认为脱离Java EE应用服务器就无 ...

  4. 惊呆了,Spring中竟然有12种定义bean的方法

    前言 在庞大的 Java 技术体系中,Spring 有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜. 我们都知道 Spring 是创建和管理bean的工厂,它提供了多种方式定义 bean,能 ...

  5. spring中那些让你爱不释手的代码技巧

    紧接上文<spring中这些能升华代码的技巧,可能会让你爱不释手>.本文继续总结我认为spring中还不错的知识点,希望对您有所帮助. 一. @Conditional的强大之处 不知道你们 ...

  6. Spring中加载xml配置文件的六种方式

    Spring中加载xml配置文件的六种方式 博客分类: Spring&EJB XMLSpringWebBeanBlog  因为目前正在从事一个项目,项目中一个需求就是所有的功能都是插件的形式装 ...

  7. java中属性文件读取案例_java相关:Spring中属性文件properties的读取与使用详解

    java相关:Spring中属性文件properties的读取与使用详解 发布于 2020-6-3| 复制链接 摘记: Spring中属性文件properties的读取与使用详解实际项目中,通常将一些 ...

  8. 如何在优雅地Spring 中实现消息的发送和消费

    本文将对rocktmq-spring-boot的设计实现做一个简单的介绍,读者可以通过本文了解将RocketMQ Client端集成为spring-boot-starter框架的开发细节,然后通过一个 ...

  9. Quartz在Spring中设置动态定时任务 .

    什么是动态定时任务: 是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定).这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...

最新文章

  1. 1.java注释的类型_HappyBKs教你写Java注解(1)——注解的分类、运行机制、作用域及概念汇总...
  2. python计算每月工资-[Python] 2018新税法下工资计算
  3. linux下如何查看chm文件
  4. Redirecting to binsystemctl start crond.service
  5. 登陆 tomcat manager
  6. Ray集群搭建 Python Demo
  7. Windows下的Makefile
  8. js window.onload 加载多个函数的两种方法
  9. CEBX格式的文档如何转换为PDF格式文档、DOCX文档?
  10. Linux下安装McAfee防病毒软件(企业版本)
  11. Xcode 之真机调试
  12. [摘]研究方法 - 实证研究
  13. 计算机光盘无法格式化,怎么格式化光盘啊??求解!!
  14. Digital Radiography厂家
  15. 『认知升级』是比其他一切都更加重要的思维模型转变
  16. 【SQLserver】使用openrowset方法导入EXCEL表格数据
  17. hive静态与动态分区理解
  18. iOS 消息转发(Message Forwarding)
  19. 诸葛io的技术架构图_大数据平台的三次浪潮和诸葛io自身架构演变历程 (3)
  20. 第七届“飞思卡尔”杯全国大学生智能汽车竞赛 赛后感想

热门文章

  1. 基于html的策略类游戏开发,基于HTML5的即时战略游戏的设计与实现
  2. java mysql orm框架_主流 Java ORM 框架有哪些?
  3. 一个菜鸟对编程的理解
  4. 散列表应用---电话号码查询系统
  5. 材料硕士转行计算机经验分享(Java开发)
  6. CS5801AN是一个HDMI2.0b到DP1.4a转换器
  7. 游戏运维编年史|可能是目前最详细的游戏运维指南
  8. 图像灰度化的常用三种方式及其实现
  9. ICMP protocal
  10. python求时间序列的极值点