【发布时间】: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
标签: java spring amazon-web-services cron amazon-elastic-beanstalk