Ant*_*gos 4 java spring scheduled-tasks azure spring-boot
在我的 Spring Boot 应用程序中,我有一个每分钟运行的计划任务。它运行一些查询来查找到期的通知,然后通过电子邮件发送它们
@Service
public class EmailSender {
@Scheduled(cron = "0 * * * * *")
public void runTask() {
// send some emails
}
}
Run Code Online (Sandbox Code Playgroud)
当我在本地测试时它工作正常,但当我将其部署到 Azure 时,每封电子邮件都会发送 2 个副本。这是因为在 Azure 中,我们运行(至少)2 个容器,这两个容器都启用了调度。
我寻找了每个容器的环境变量,调度程序将检查该环境变量,并且仅在该变量设置为“true”时才运行作业,但找不到任何可靠的方法来实现此目的。
我现在正在考虑以下问题
这似乎增加了很多额外的复杂性,我想知道是否有更简单的解决方案?
默认情况下,Spring 无法处理多个实例 \xe2\x80\x93 上的调度程序同步,而是在每个节点上同时执行作业。所以有两种可能的解决方案:
\n不过,您可以使用Spring ShedLock来处理这个问题。这里有一个您可以使用的指南:Spring ShedLock。您可以在那里找到实现此锁所需的所有代码。
\n它通过使用数据库中的参数来工作,该参数向其他节点提供有关该任务的执行状态的信息。通过这种方式,ShedLock 可以防止您的计划任务同时执行多次。如果一个任务正在一个节点上执行,它会获取一个锁,以防止从另一个节点执行同一任务。
\n您可以在他们的Github 页面中找到有关如何使用不同数据库处理它的更多信息。
\n您可以创建两个不同的配置文件,例如,一个是prod
,另一个是cron
。然后,您可以将注释放在@Profile("cron")
调度程序类上,以便它们仅在第二个配置文件上运行。
然后你必须构建应用程序两次:
\n-Dspring.profiles.active=prod
并正常部署它。-Dspring.profiles.active=prod,cron
,您必须将其部署在\n不自动缩放的环境中,以便您可以确保\n只有一个实例。 归档时间: |
|
查看次数: |
2320 次 |
最近记录: |