当前位置: 首页 > 知识库问答 >
问题:

Spring Quartz重排作业第一次执行两次

那铭
2023-03-14

我使用Quartz1.5.2和Spring3.2.1来做调度器任务,在我的应用程序中,我需要在某个时候重新安排任务,但我发现每次重新安排任务时,它都会在第一次执行两次。

下面是我的Quartz+Spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd ">

    <bean id="testScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="startupDelay" value="0"/> 
        <property name="triggers">
            <list>
                <ref bean="testJobTrigger" />
            </list>
        </property>
    </bean>

    <bean id="testJob" class="com.lucumt.quartz.JobScheduler"></bean>

    <bean id="testJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="testJob" />
        <property name="targetMethod" value="schedulerJob" />
        <property name="concurrent" value="false"/>
    </bean>

    <bean id="testJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="testJobDetail" />
        <property name="cronExpression" value="0/10 * * * * ?" />
    </bean>

</beans>

我把它作为一个web应用程序,下面是web.xml的代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>Dynamic Quartz Scheduler</display-name>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring-context-*.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:spring-context-*.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>

</web-app>
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletContext;

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.CronTriggerBean;
import org.springframework.web.context.ServletContextAware;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class JobScheduler implements ServletContextAware {

    private DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    private ServletContext context;

    private int count = 0;
    private String type = "10";

    @Override
    public void setServletContext(ServletContext context) {
       this.context=context;        
    }

    public void schedulerJob() {
        count++;
        System.out.println("=========fixed output: " + df.format(new Date())+"\t"+count);
        if(count%4==0){
            if(type.equals("10")){
                this.resetJob("0/30 * * * * ?");
            }else if(type.equals("30")){
                this.resetJob("0/10 * * * * ?");
            }

            if(type.equals("10")){
                type = "30";
            }else{
                type = "10";
            }
        }
    }

    public void resetJob(String expression){
        System.out.println("****************change to:\t" + expression);
        ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
        Scheduler scheduler = (Scheduler) applicationContext.getBean("testScheduler");
        try {
            CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger("testJobTrigger", Scheduler.DEFAULT_GROUP);
            trigger.setCronExpression(expression);
            scheduler.rescheduleJob("testJobTrigger", Scheduler.DEFAULT_GROUP, trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
//I think these two lines may cause the problem,but I don't know how to modify it.
ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
Scheduler scheduler = (Scheduler) applicationContext.getBean("testScheduler");

public void resetJob(String expression){
    System.out.println("****************change to:\t" + expression);
    ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
    Scheduler scheduler = (Scheduler) applicationContext.getBean("testScheduler");
    try {
        //CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger("testJobTrigger", Scheduler.DEFAULT_GROUP);
        CronTriggerBean trigger = new CronTriggerBean();
        trigger.setName("testJobTrigger");
        trigger.setGroup(Scheduler.DEFAULT_GROUP);
        trigger.setJobName("testJobDetail");
        trigger.setCronExpression(expression);
        scheduler.rescheduleJob("testJobTrigger", Scheduler.DEFAULT_GROUP, trigger);
    } catch (SchedulerException e) {
        e.printStackTrace();
    } catch (ParseException e) {
        e.printStackTrace();
    }
}

共有1个答案

赫连法
2023-03-14

尝试创建一个新的触发器对象,不要重用旧的触发器对象。

 类似资料:
  • 如何将CronTimer迭代器设置为1?或者如何停止排定程序多次执行作业。 有什么建议吗?谢谢,古扬·沙阿。

  • 我有一个使用Quartz1.6.6的Java应用程序。它被部署到Weblogic上,Weblogic的体系结构包括两个应用服务器。 令人困惑的是,我有另一个Java应用程序,其中包含了Quartz调度,它似乎运行得非常愉快。另一个应用程序有一个相同的机制,每分钟触发一个触发器,从日志中我可以看到该作业每60秒只运行一次。 昨天下午作业已运行的次数示例: 15:10:46,984 15:10:49,

  • 我有一个代码来安排每5分钟执行一个作业。代码如下 制作触发器的代码如下所示。 现在我通过下面的代码安排作业

  • 问题内容: 我正在尝试使用jaxb- maven插件使用JAXB将多个XSD转换为不同包中的POJO。我已将其设置为使用多个执行块,然后执行第一个执行块,然后出现一条消息:模式或绑定文件中未检测到更改 这是我pom.xml的摘录: 这是我收到的错误消息: 如果我交换执行块,则第一个总是执行,其余两个块得到相同的消息。 关于如何解决这个问题的任何想法? 问题答案: 通过升级到版本1.6进行了修复 和

  • 从HomeActivity我正在尝试从CreateProfileActivity获取结果。在这里我要做什么来开始这个活动 以下是HomeActivity中方法的实现: 当im完成并按下save in后,下面是我将数据发送回HomeActivity的操作: 在上调用setResult方法一次,但由于某种未知原因,当数据到达方法时,get execute两次。第一个结果的和第二个结果的。在此之后,得到