spring@scheduled:如何检测方法是否作为作业调用?

zlwx9yxi  于 2021-07-16  发布在  Java
关注(0)|答案(2)|浏览(341)

Spring有Spring @Scheduled 使方法作为计划作业调用的注解。
是否有支持的方法在方法中识别它是由这个调度调用的,还是直接从其他代码调用的?
supported 我的意思是,它不可能是像检查调用堆栈这样的黑客行为,或者依赖于上下文中某个地方的http请求之类的副作用。

qyuhtwio

qyuhtwio1#

如前所述,这是不可能的。简单想想你的设计,如果你想知道什么时候从调度器中调用它,提取一个被调度的方法,然后用一个附加的参数调用你的方法,比如 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()));
kzipqqlq

kzipqqlq2#

你试过使用方面吗?像这样:

@Aspect
@Component
public class LogInterceptor {

    private static final Logger log = LoggerFactory.getLogger(LogInterceptor.class);

    @Before("execution(public * my.package.name.schedulers..*.*(..))")
    public void logBeforeAllSchedulers(JoinPoint joinPoint) {
        String className = joinPoint.getSignature().getDeclaringType().getSimpleName();
        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();

        log.debug("Executing: [{}]", "class: " + className + ", method: " + methodName + ", arguments: " + Arrays.toString(args));
    }
}

相关问题