我有一个Java + Spring (3.2.9.RELEASE)堆栈,部署在AWS弹性Bean秸秆中,配置为最大为1个实例。但是,我注意到我的后台作业在两个不同的线程中连续执行两次。
后台作业计划为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中,更具体地说,迁移到了ElasticBean秸秆。我们知道我们还没有配置后台作业来处理多节点环境,因此我们将弹性Bean秸秆设置为具有最小/最大值为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弹性豆茎之后才会看到这种行为。
该应用程序运行在:64位Amazon 2014.03 v1.0.2上运行Tomcat 7 Java 7
有什么想法?
发布于 2014-09-09 18:13:21
我建议在您的环境中使用最新的解决方案栈“64位Amazon 2014.03 v1.0.4运行Tomcat7Java7”。
https://stackoverflow.com/questions/25744217
复制相似问题