繁体   English   中英

Shedlock 与 Spring 云 Function @PollableBean

[英]Shedlock with Spring Cloud Function @PollableBean

我最近将我们几乎所有服务的实施切换到 spring 云 function,这自然也意味着所有预定的作业都已转换为供应商,例如从这个

@Scheduled(cron = "${retry.job.cron.time}")
@SchedulerLock(name = "retryProcess_scheduledTask", lockAtMostFor = "${retry.job.lock.atMost}", lockAtLeastFor = "${retry.job.lock.atLeast}")
public void retryUnprocessedItems() { ...}

对此

@PollableBean
public Supplier<List<Message<ProductValidatedEvent>>> retryUnprocessedItems() { ... }

正如您所看到的,这里唯一的障碍是实现了某种分布式锁机制,以防止那些PollableBean注释的Suppliers在所有服务实例上启动。

我曾考虑将计划的作业恢复到原来的位置并使用StreamBridge来解决这个问题,但这听起来更像是一个 hack,而不是一个解决方案。

另一个想法是将供应商转换为Function接口类型,并通过正常的@Scheduled注解方法调用它,但这似乎与Spring云ZC1C425268E68385D1AB5074C17A9设置得不好。

有任何想法吗?

这真的很有趣。 我看到解决这个问题的两种方法。

  1. 最直接的就是在另一种方法上使用AOP
@PolllableBean
public Supplier<Void> retryUnprocessedItems(){ 
    return otherBean::doIt;
}

class OtherBean {
  @SchedulerLock(...)
  public void doIt() {
    ....
  }
}

请注意,该方法在不同的 class 上实现以允许 AOP 工作。 此外,我不得不将返回类型更改为Void ,因为如果锁被锁定,我们不知道要返回什么。

  1. 另一种选择是在没有框架的情况下使用锁定

根据上面 Lukas 的回答,我已经能够更新我的代码,以便它使用 Spring AOP,我创建了一个ScheduledTask组件,它只有一个包含Supplier逻辑的方法,用@SchedulerLock注释标记,并返回要发出的值由供应商稍后讨论 Kafka 主题

@Autowired
ScheduledTask task;

@PollableBean
public Supplier<String> getScheduledJob() {
    return task::fire;
}

@Slf4j
@Component
class ScheduledTask {
    @SchedulerLock(name = "myJobLock", lockAtMostFor = "10s", lockAtLeastFor = "1s")
    public String fire() {
        log.info("Task was fired");
        return (String.valueOf(System.currentTimeMillis()));
    }
}

您可以在此处找到运行示例https://github.com/Mahm0ud/ShedlockWithSpringCloudFunction

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM