Spring有Spring @Scheduled 使方法作为计划作业调用的注解。是否有支持的方法在方法中识别它是由这个调度调用的,还是直接从其他代码调用的?由 supported 我的意思是,它不可能是像检查调用堆栈这样的黑客行为,或者依赖于上下文中某个地方的http请求之类的副作用。
@Scheduled
supported
qyuhtwio1#
如前所述,这是不可能的。简单想想你的设计,如果你想知道什么时候从调度器中调用它,提取一个被调度的方法,然后用一个附加的参数调用你的方法,比如 fromScheduler .像这样:
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()));
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)); } }
2条答案
按热度按时间qyuhtwio1#
如前所述,这是不可能的。简单想想你的设计,如果你想知道什么时候从调度器中调用它,提取一个被调度的方法,然后用一个附加的参数调用你的方法,比如
fromScheduler
.像这样:
它是毛茸茸的,但它可以避免看堆栈跟踪。就我个人而言,我看不出有什么理由不能只使用堆栈跟踪。
kzipqqlq2#
你试过使用方面吗?像这样: