当前位置: 首页 > 面试题库 >

石英失败时重试

邵奇
2023-03-14
问题内容

假设我以这种方式配置了一个触发器:

<bean id="updateInsBBTrigger"         
    class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="updateInsBBJobDetail"/>
    <!--  run every morning at 5 AM  -->
    <property name="cronExpression" value="0 0 5 * * ?"/>
</bean>

触发器必须与另一个应用程序连接,并且如果存在任何问题(例如连接失败),则触发器应每10分钟重试任务五次,直到成功为止。有什么方法可以配置触发器使其工作?


问题答案:

来源
:自动重试Quartz中失败的作业

如果您想要一项不断尝试直到成功的工作,您要做的就是抛出一个带有标志的JobExecutionException,以通知调度程序在失败时再次触发它。以下代码显示了如何:

class MyJob implements Job {

    public MyJob() {
    }

    public void execute(JobExecutionContext context) throws JobExecutionException {

        try{
            //connect to other application etc
        }
        catch(Exception e){

            Thread.sleep(600000); //sleep for 10 mins

            JobExecutionException e2 = new JobExecutionException(e);
            //fire it again
            e2.setRefireImmediately(true);
            throw e2;
        }
    }
}

如果要重试一定次数,它将变得更加复杂。您必须使用StatefulJob并将retryCounter保留在其JobDataMap中,如果作业失败,则将其递增。如果计数器超过最大重试次数,则可以根据需要禁用该作业。

class MyJob implements StatefulJob {

    public MyJob() {
    }

    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        int count = dataMap.getIntValue("count");

        // allow 5 retries
        if(count >= 5){
            JobExecutionException e = new JobExecutionException("Retries exceeded");
            //make sure it doesn't run again
            e.setUnscheduleAllTriggers(true);
            throw e;
        }


        try{
            //connect to other application etc

            //reset counter back to 0
            dataMap.putAsString("count", 0);
        }
        catch(Exception e){
            count++;
            dataMap.putAsString("count", count);
            JobExecutionException e2 = new JobExecutionException(e);

            Thread.sleep(600000); //sleep for 10 mins

            //fire it again
            e2.setRefireImmediately(true);
            throw e2;
        }
    }
}


 类似资料:
  • 我面临着石英和缺火的痛苦问题。 我的应用程序创建允许用户创建CronTrigger和SimpleTrigger作业。 每个作业都可以暂停/恢复(使用Scheduler.pauseJob和Scheduler.resumeJob) 调度程序本身可以设置为待机。 我们希望放弃任何缺火: 当调度程序处于待机状态时 作业暂停时 当应用程序停止时 正如在这篇博文中所解释的http://www.nurkiewi

  • 我在使用quartz scheduler运行web应用程序时遇到以下错误。 我使用两个数据库连接和石英,我想使用德比,所以我给德比事务管理器在我的配置文件。 此配置文件中的问题是什么,quartz调度程序如何尝试访问数据库。 我的配置文件如下所示:

  • 问题内容: 似乎Quartz Scheduler每秒可以运行的作业数量受到限制。在我们的方案中,我们每秒大约有20个作业,可以进行24x7的启动,而石英可以很好地完成每秒10个作业(对于JDBC支持的JobStore,它具有100个石英线程和100个数据库连接池大小),但是,当我们将其增加到20个时每秒的作业数量,石英变得非常非常慢,与实际的计划时间相比,石英的触发作业非常晚,从而导致许多失火,并

  • 我正在使用带有TerracottaJobStore Class的石英调度程序来每5分钟调度一次作业。我的工作配置是: 组织。石英jobStore。class=org。陶土。石英EnterpriseTerracottaJobStore组织。石英jobStore。tcconfig=localhost:9510 org。石英线程池。线程数=25 我有一个附加了5000个触发器的单个作业,然后该作业被安排

  • 我需要实施一个连续的任务时间表, 我通过Quartz通过,接下来的三次执行 但我希望02:45:00之后的下一次行刑是在03:30:00而不是03:00:00 有什么办法能做到吗

  • 问题内容: 有没有办法将石英作为基础调度程序? 我可以想到两件事,但都需要做一些工作: 创建一个将解析注解并注册石英作业的自定义 实施委托石英的工具。 问题是:以上两个选项是否已经编写过,是否还有另一个选项? 问题答案: 我最终制作了自己的弹簧石英“桥”。我打算建议将其作为春季的改进。 首先,我创建了一个新注释,该注释将放置在实现quartz Job接口的类上: (请注意原型作用域-石英假定每个作