Java Spring 调度器锁

标签 java spring quartz-scheduler scheduler

我一直在尝试向我的客户发送通知。我正在使用 kubernetes 并且我创建了多个 spring boot 应用程序,因为我有 2 个副本。这一切都很好,但是当调度程序运行时,它们中的每一个都可以发送通知。我看过一点 quartz ,但配置似乎有点复杂。有没有简单的方法来做到这一点?

@Scheduled(fixedDelayString = "300000")
public void sendFlowerNotification() {
  //Code
}

最佳答案

您还可以使用 dlock在多个节点上只执行一次计划任务。您可以简单地执行如下操作。

@Scheduled(fixedDelayString = "300000")
@TryLock(name = "flowerNotification", owner = POD_NAME, lockFor = THREE_MINUTES)
public void sendFlowerNotifications() {
  List<Notification> notifications = notificationService.getNotifications();
  for(Notification notification: notifications){
    sendNotification(notification);
  }
}

您可以将 POD_NAME 作为环境变量发送到 spring。 dlock 会自动处理它。

 env:
 - name: POD_NAME
   valueFrom:
     fieldRef:
       fieldPath: metadata.name

参见 article关于使用它。

关于Java Spring 调度器锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53024514/

相关文章:

quartz-scheduler - 以“user”的身份运行Quartz.NET作业-权限问题

java - 使用 enum 处理整数事件类型

java - Wicket:指定全局应用程序属性的模式

Spring Data REST 分页

java - 如何使用 mockMvc 检查响应正文中的字符串

java - Spring 错误 - springframework.web.client.HttpClientErrorException : 404 Not Found

java - Quartz 调度程序 - 是否可以配置 Quartz 以允许 RAMJobStore 中具有相同标识的作业?

java - 如何从 Quartz 调度程序中查询已调度的作业?

java - 发现名称 : getText 存在冲突的 getter

java - Swagger 配置 - 访问 swagger.json 时出现 404