簡體   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