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

Spring 3.2“@Scheduled”注释的异常处理

柴晔
2023-03-14

如何定制spring中@Scheduled注释的异常处理?

我有Cron作业,这些作业将在服务器(Tomcat 6)中触发,当出现任何异常时,我需要进行一些处理。

  • Spring版本3.2
  • Tomcat服务器6

共有3个答案

蒯宏达
2023-03-14

为什么不包装您的业务逻辑,在@schedule方法中做一个简单的try-catch呢。然后,您可以记录或采取任何必要的措施来应对失败案例。

@Scheduled(cron = "${schedulerRate}")
public void scheduledJob() {
    try {
        businessLogicService.doBusinessLogic();
    } catch (Exception e) {
        log.error(e);
    }
}
松锐藻
2023-03-14

您可以为ThreadPoolTaskScheduler实现并注册一个ErrorHandler,该调度器用于调度注释。

 <task:annotation-driven scheduler="yourThreadPoolTaskScheduler"  />

 <bean id="yourThreadPoolTaskScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
        <property name="poolSize" value="5" />
        <property name="errorHandler" ref="yourScheduledTaskErrorHandler" />
 </bean>

 <bean id="yourScheduledTaskErrorHandler" 
     class="com.example.YourScheduledTaskErrorHandler"/>
焦苏燕
2023-03-14

如果你想使用Java配置,你需要创建配置来实现SchedulingConfigurer

@EnableScheduling
@Configuration
class SchedulingConfiguration implements SchedulingConfigurer {
    private final Logger logger = LoggerFactory.getLogger(getClass());
    private final ThreadPoolTaskScheduler taskScheduler;

    SchedulingConfiguration() {
        taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setErrorHandler(t -> logger.error("Exception in @Scheduled task. ", t));
        taskScheduler.setThreadNamePrefix("@scheduled-");

        taskScheduler.initialize();
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskScheduler);
    }
}

您可以根据需要修改错误处理程序。这里我只记录一条消息。

别忘了给taskScheduler打电话。初始化();。没有它,你会得到:

java.lang.IllegalStateException: ThreadPoolTaskScheduler not initialized
 类似资料:
  • 问题内容: 假设我有一个抛出某种Exception的方法。引发异常的代码位于访问外部服务的第三方库中。我有一些课程可以很好地处理外部服务,并且有很多异常处理程序可以处理潜在的问题。我遇到的问题是我可能有很多异常,但是如果有一个动作,并且可能有大量尝试/捕获块,我可能只需要执行几个动作之一。异常的类型甚至可能不相关,或者不同的方法可能会抛出相同类型的异常,但是根据抛出该异常的方法,需要采取不同的操作

  • 我一直在研究ControllerAdvice和ExceptionHandler注释,但我认为这两个注释都不能按照我们的预期使用。ControllerAdvice只能覆盖整个控制器,因此任何异常处理也将覆盖非Ajax方法。类似地,ExceptionHandler注释将处理来自这两种类型方法的异常。 目前的想法是将ajax和CRUD这两种类型的方法拆分为单独的控制器。还有别的办法吗?

  • 我有两个映射到OneToMany、ManyToOne的类,我得到了异常: org.hibernate.annotationException:mappedBy引用了一个未知的目标实体属性:entity_package.ticketentity.ownerEntity in entity_package.userentity.ownedTickets 公共类TicketEntity实现可序列化{ 怎

  • 我正在使用注释处理器来处理方法参数的注释。 用于参数的注释类型有一个注释@参数 现在,当注释处理器运行时,我想检查参数注释()是否有参数注释。我通过执行以下代码来实现这一点。 由于某种原因,arg始终为空。是否有注释未返回的原因?

  • 我想在hibernate中进行一对多映射,但它显示出异常,我尝试了很多,但找不到解决方案 我有下面两张桌子 deptno--数字主键dname--varchar2(10) loc--varchar2(10) empno--数字主键 用户名--varchar2(10) deptno--数字(10)外键 当我没有在Dept.java类上添加@Entity注释时,我会在stacktrace下面看到 当我

  • 在我的Spring Boot(1.4.2版)应用程序中,我有很多计划的任务,希望使用一个处理程序捕获所有异常,就像使用@ExceptionHandler注释的普通控制器一样。由于线程问题,这种方法不适用于使用@Scheduled annotation定义的任务: @ExceptionHandler不适用于@计划方法(事实证明它并不意味着)。相反,Spring Boot使用它自己的LoggingEr