spring - Spring @Scheduled:如何检测方法是否被称为作业?
问题描述
Spring 具有@Scheduled
使方法被称为计划作业的注释。
是否有支持的方法在方法中识别它是由这个调度调用的,还是直接从其他代码调用的?
我的意思是,supported
它不能像检查调用堆栈这样的黑客行为,或者依赖于上下文中某处的 HTTP 请求等副作用。
解决方案
如前所述,这是不可能的。快速思考一下您的设计,如果您想知道何时从调度程序调用它,请提取一个已调度的方法并使用添加的参数(如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()));
推荐阅读
- laravel - Laravel 下载图片
- flutter - Flutter Listview builder在热重载之前是空白的
- linux - cloud-init 使用 DHCP 中给定的域作为主机名
- string - 使用 Rust 中的自定义派生宏获取具有任何结构的字段名称的原始 vec
- reactjs - 如何在功能组件上同时使用 withWidth 和 withStyles 作为高阶组件?
- excel - EXCEL INDIRECT 动态地显示工作表和单元格
- r - 1:l 中的错误:Yhat 错误中长度为 0 的参数
- sdk - swashbuckle 可以将一个 swagger 文档序列化为 v2,而将其他文档序列化为 v3?
- php - 视频/mp4 未使用 Webpack、Laravel 8 中的 Laravel Mix 和 reactjs 加载
- javascript - 如何在 Js 中保存 HTML 值