我最近将我们几乎所有服务的实现都切换到了 Spring Cloud 功能,这自然也意味着所有预定的作业都已转换为供应商,例如从这个
@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
用来解决这个问题,但这听起来更像是一个黑客而不是一个解决方案。
另一种思路是将供应商转为Function
接口类型,通过普通的带@Scheduled
注解的方法调用,不过这个好像和Spring cloud的功能也不好设置。
有任何想法吗?