当前位置: 首页 > 知识库问答 >
问题:

在运行时控制 Spring 计划任务

燕雨石
2023-03-14

我有一套使用spring框架用Java写的服务。一些服务有预定的任务(使用spring的< code>@Scheduled注释)来做一些内务处理(生成处理过的数据,数据清理等。).由于这些计划任务,我不能运行服务的多个实例,因为所有实例都选择相同的任务,并且多次执行,导致重复/损坏的数据。为了解决这个问题,我想在任务执行时进行检查,并且只允许在一个实例上执行。我该怎么做?这个问题有更好的解决方法吗?

共有1个答案

荆梓
2023-03-14

这个问题有多种解决方案。

您可以使用 Shedlock 一个 Spring Boot 库,该库适用于数据库中的锁。

或者您可以通过使用on Queue来解决它,如下所示:

  • 将所有计划的任务移动到一个单独的(小)服务,其目的是将事件/消息发送到队列,以便其他服务可以使用这些事件/消息
  • 您的服务应该侦听事件并执行任务

现在,您可以毫无问题地扩展服务。而且,由于消息被发送到队列中,因此只有1个服务将使用该消息。

你也可以用类似 Kafka 的消息代理来实现同样的目标,但在这里你必须确保你的服务属于一个消费者组,以便消息在服务之间得到负载均衡。

此解决方案的另一个优点是,您只需终止调度程序服务即可轻松关闭所有 cronjob,而不会影响您的服务/应用程序。

 类似资料:
  • 我在context.xml文件中定义了一个Spring调度任务,它每分钟运行一次。该任务调用postgres存储过程。存储过程运行时可以持续一分钟以上。如果当前运行没有完成,spring框架会调用相同的调度程序吗?谢谢,

  • 问题内容: 是否可以在确切指定的时间仅安排一次Spring服务方法?例如,当前时间是下午2点,但是当我按下操作按钮时,我希望我的服务方法从晚上8点开始。我熟悉@Scheduled批注,但不确定如何编写cron表达式以使其不定期运行。这一次,每天晚上8点触发。 有什么建议? 问题答案: 您可以使用Spring的TaskScheduler的实现之一。我在下面提供了一个示例,该示例不需要太多配置(包装了

  • > 我需要在执行前一个任务后以不同的延迟一个接一个地运行计划的任务。示例。有一个任务列表和延迟列表。 现在我需要运行task1通过100ms,task2在task1之后通过9ms,task3在task2之后通过22ms等等。 我正在使用javafx。任务可以使用一些UI更新方法,例如更改节点位置。这迫使我使用平台。runLater()方法,因为如果不这样做,则会出现异常“Not on FX app

  • 我正在编写一个应用程序,它有一个cron作业,每60秒执行一次。应用程序配置为在需要时扩展到多个实例。我只想每60秒在一个实例上执行一次任务(在任何节点上)。开箱即用,我找不到解决这个问题的方法,我很惊讶以前没有人问过多次。我使用的是Spring 4.1.6。

  • 我正在尝试用ECS Fargate设置一个计划的任务,但我不知道为什么它没有运行。我可以使用确认任务正常工作,但当我试图按计划触发它时,得到的只是一堆没有任何解释的'failedinvocations'。 虽然我知道规则正在被触发,所以这是一个好的迹象。见下方截图: 但每次触发它时,只有一个“FailedInvocation”。安排规则如下: 谢谢 编辑:区域现在支持此操作。请参阅备注。

  • 我们在Spring web应用程序中使用预定任务来发送提醒、每日摘要等: 每个调度任务调用一个给定的服务方法(上面伪代码中的fooService.bar())。我想监控每次处决持续多长时间。随着负载、数据或复杂性的增加,其中一些方法可能需要更长的时间。我可以给每个服务方法添加日志记录语句(现在大约有10个,但将来可能会更多),或者使用方面给每个方法添加一些秒表行为。但是,对于spring中的所有预