首页 > 解决方案 > Spring @Scheduled:如何检测方法是否被称为作业?

问题描述

Spring 具有@Scheduled使方法被称为计划作业的注释。

是否有支持的方法在方法中识别它是由这个调度调用的,还是直接从其他代码调用的?

我的意思是,supported它不能像检查调用堆栈这样的黑客行为,或者依赖于上下文中某处的 HTTP 请求等副作用。

标签: springspring-scheduled

解决方案


如前所述,这是不可能的。快速思考一下您的设计,如果您想知道何时从调度程序调用它,请提取一个已调度的方法并使用添加的参数(如fromScheduler.

像这样的东西:

@Scheduled
public void callAnotherMethod() {
   methodYouWantToCall(true);
}

public void methodYouWantToCall(boolean fromScheduler) {
   if (fromScheduler) {
      log.debug("called from scheduler");
   } else {
      log.debug("non from scheduler");
   }
}

它很毛茸茸,但它会避免查看堆栈跟踪。就个人而言,我看不出有任何理由不能只使用堆栈跟踪。

boolean scheduled = Arrays.stream(Thread.currentThread().getStackTrace())
    .anyMatch(stackTraceElement -> stackTraceElement.getClassName().contains(
        ScheduledMethodRunnable.class.getName()));

推荐阅读