2

有一个应用程序通过调度程序运行某个进程,就像我们有多个实例一样,我们选择shedlock来阻止其他运行相同的进程。但是,由于sleuth提供了一个 Runnable 实例,它是 TraceRunnable 并且预期是 ScheduledMethodRunnable,所以它不起作用。有什么想法可以解决这个问题吗?

类 SpringLockConfigurationExtractor

@Override
public Optional<LockConfiguration> getLockConfiguration(Runnable task) {
    if (task instanceof ScheduledMethodRunnable) {
        ScheduledMethodRunnable scheduledMethodRunnable = (ScheduledMethodRunnable) task;
        return getLockConfiguration(scheduledMethodRunnable.getTarget(), scheduledMethodRunnable.getMethod());
    } else {
        logger.debug("Unknown task type " + task);
    }
    return Optional.empty();
} 
4

2 回答 2

3

我与开发人员交谈并按照文档将 param interceptMode 设置为PROXY_METHOD及其工作。他提到这将是未来版本中的默认值,有利于避免此类问题。

@EnableSchedulerLock(defaultLockAtMostFor = "PT5M", interceptMode = PROXY_METHOD)

于 2019-11-21T15:53:51.453 回答
0

您必须提供自己的 implSchedulerProxyScheduledLockAdvisor来验证任务的类是否为TraceRunnable. 如有必要,您还可以禁用部分 Sleuth。你也可以向 Shedlock 的作者索取一些钩子来解决这个问题。

于 2019-11-21T12:43:33.457 回答