[英]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設置得不好。
有任何想法嗎?
這真的很有趣。 我看到解決這個問題的兩種方法。
@PolllableBean
public Supplier<Void> retryUnprocessedItems(){
return otherBean::doIt;
}
class OtherBean {
@SchedulerLock(...)
public void doIt() {
....
}
}
請注意,該方法在不同的 class 上實現以允許 AOP 工作。 此外,我不得不將返回類型更改為Void
,因為如果鎖被鎖定,我們不知道要返回什么。
根據上面 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.