AWS Beanstalk 中 Spring cron 作业的双重执行(2 个线程)

Posted

技术标签:

【中文标题】AWS Beanstalk 中 Spring cron 作业的双重执行(2 个线程)【英文标题】:Double execution (2 threads) of Spring cron job in AWS Beanstalk 【发布时间】:2014-11-02 20:25:15 【问题描述】:

我在 AWS Elastic Beanstalk 中部署了一个 Java + Spring (3.2.9.RELEASE) 堆栈,最多配置了 1 个实例。但是,我注意到我的后台作业在该实例中在 2 个不同的线程中连续执行两次。

后台作业被安排为 cron 作业,Spring 设置:

<task:annotation-driven scheduler="scheduler" />
<task:scheduler id="scheduler" pool-size="5" />
<task:scheduled-tasks scheduler="scheduler">

    <task:scheduled ref="className1" method="methodName1"
        cron="$scheduler.property1name.cronschedule" />

    <task:scheduled ref="className2" method="methodName2"
        cron="$scheduler.property2name.cronschedule" />

    <task:scheduled ref="className3" method="methodName3"
        cron="$scheduler.property3name.cronschedule" />

</task:scheduled-tasks>

由于应用逻辑原因,methodName1 是唯一真正执行任务的(methodName2 和其他任务不满足应用逻辑条件)。由于我注意到 methodName1 被执行了两次,我添加了日志以查看它的来源:

public void methodName1()

    // DEBUGGING to see which machine is running in AWS
    try
    
        java.net.InetAddress localMachine = java.net.InetAddress.getLocalHost();
        logger.debug("Hostname of local machine: " + localMachine.getHostName() + "/ " + localMachine.getHostAddress());
    
    catch(Exception ex)
    
        logger.debug("Failed to retrieve machine name", ex);
    
    // DEBUGGING

    actuallyExecuteMethodName1();

现在,在我们自己的内部服务器(单节点设置)上运行了同样的代码,过去一年没有任何问题。最近,我们将此应用程序移至 AWS,更具体地说,移至 Elastic Beanstalk。我们知道我们尚未将后台作业配置为处理多节点环境,因此我们将 Elastic Beanstalk 设置为具有最小/最大 1 个实例,直到我们进行必要的更改。

查看来自 AWS 的应用程序日志:

04:15:00,002 [scheduler-3] DEBUG ClassName1- methodName1- Hostname of local machine: ip-###.###.###.###/ ###.###.###.###
04:15:00,003 [scheduler-2] DEBUG ClassName1- methodName1- Hostname of local machine: ip-###.###.###.###/ ###.###.###.###

任务执行两次,每次在不同的线程上相隔 1 毫秒。 我们只是在迁移到 AWS Elastic Beanstalk 后才看到这种行为。

应用程序正在运行: 运行 Tomcat 7 Java 7 的 64 位 Amazon Linux 2014.03 v1.0.2

想法?

【问题讨论】:

您能否给出您正在使用的 Tomcat 解决方案堆栈的确切名称? 64 位 Amazon Linux 2014.03 v1.0.2 运行 Tomcat 7 Java 7 【参考方案1】:

我建议为您的环境使用最新的解决方案堆栈“64bit Amazon Linux 2014.03 v1.0.4 running Tomcat 7 Java 7”。

【讨论】:

升级 Amazon Linux 映像版本对我有什么帮助?是否有任何特定的错误已修复? 在那个版本和这个版本之间发生了几个错误修复。我无法指出一个错误修复来解释您所看到的行为。可能有来自实例的详细日志,我可以更深入地挖掘,但我建议使用最新版本,希望你不会看到最新版本有问题。告诉我进展如何。 谢谢 Rohit - 所以你认为不同线程上的多次执行是由容器而不是应用程序级别引起的完全合理吗?您是否有 1.0.2 和 1.0.4 之间的发行说明/更改日志?谢谢! 我不能 100% 确定这是一个容器问题。 很好,谢谢...您有关于这些版本更新的发行说明/更改日志吗?我需要一些可以挖掘的东西来解释这种行为

以上是关于AWS Beanstalk 中 Spring cron 作业的双重执行(2 个线程)的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS Elastic Beanstalk 在 AWS 上部署 Spring Boot 应用程序

AWS Beanstalk 中 Spring cron 作业的双重执行(2 个线程)

S3 中的 Spring Boot 配置 - AWS beanstalk

将 Spring Boot 应用程序部署到 AWS beanstalk

Spring Boot版本升级-在aws elastic beanstalk中部署时出现mysql错误

AWS Elastic Beanstalk Spring Boot fat JAR:找不到jsp