首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧云函数@PollableBean的Shedlock

弹簧云函数@PollableBean的Shedlock
EN

Stack Overflow用户
提问于 2022-01-12 16:06:23
回答 2查看 204关注 0票数 1

最近,我将几乎所有服务的实现都转换为spring云功能,这当然也意味着所有计划中的作业都已转换为供应商,例如从这里

代码语言:javascript
复制
@Scheduled(cron = "${retry.job.cron.time}")
@SchedulerLock(name = "retryProcess_scheduledTask", lockAtMostFor = "${retry.job.lock.atMost}", lockAtLeastFor = "${retry.job.lock.atLeast}")
public void retryUnprocessedItems() { ...}

到这个

代码语言:javascript
复制
@PollableBean
public Supplier<List<Message<ProductValidatedEvent>>> retryUnprocessedItems() { ... }

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

我已经考虑过将计划中的作业恢复到原来的位置,并使用StreamBridge来解决这个问题,但这听起来不仅仅是一种解决方案。

另一个想法是将供应商转换为Function接口类型,并通过一个普通的@Scheduled注释方法调用它,但这似乎也不能很好地设置Spring云功能。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-17 18:22:12

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

  1. 最直接的方法是在另一种方法上使用AOP。
代码语言:javascript
复制
@PolllableBean
public Supplier<Void> retryUnprocessedItems(){ 
    return otherBean::doIt;
}

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

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

  1. 另一种选择是使用无框架锁定
票数 1
EN

Stack Overflow用户

发布于 2022-01-18 17:39:32

基于上面的Lukas答案,我已经能够更新我的代码,以便它使用Spring,我创建了一个ScheduledTask组件,其中只有一个方法包含Supplier逻辑,标记为@SchedulerLock注释,并返回供应商稍后将发出的值到Kafka主题。

代码语言:javascript
复制
@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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70684735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档