此代码有问题。我有2个同时运行JVM的服务器serverA和serverB。除了名称之外,所有过程,软件都是相同的。这个想法是,如果serverA上的JVM发生故障,则serverB上的JVM将立即接管。
要检查哪个服务器是主服务器,我运行了一个检查方法,该方法将更新数据库中的表(服务器名称和更新日期)。
例如,当serverA为main时,它将检查数据库中的当前服务器是否为serverA。如果是这样,它将更新服务器名称和数据库的最后更新时间。如果不是(main = ServerB),它将检查当前时间与上次更新时间之间的时差。如果结果> 50秒(建议当前的主服务器出现问题),则serverA会将自身更新为主服务器。
我面临的问题是,在某些情况下,两个服务器都将自己更新为主要服务器。例如:
ServerA在6:20:23左右更新
ServerB在6:20:59左右更新
由于这两个试图同时运行JVM进程,所以我有两个JVM在同一作业上创建锁的实例。通常,当发生这些问题时,非主服务器的JVM将挂起,并最终出现内存不足错误。
我想知道是否有任何方法可以在另一台服务器接管时停止一台服务器(重新启动JVM?),或防止两台服务器争夺主要位置。
任何帮助将不胜感激。
if (WmsParam.HOST_SERVER_NAME.equals(r.getLastUpdatePname())) //check if current server is still main
{
result = true;
}
else
{
Calendar nowTime = Calendar.getInstance();
long lastUsed = r.getLastUpdateDate().getTime();
long nowTimeMili = nowTime.getTimeInMillis();
long diff = nowTimeMili - lastUsed;
long diffSec = diff /1000;
if (diffSec >= WmsParam.HOST_DELAY_SECONDS) //host_delay_seconds = 50
{
result = true;
}
}
if (result)
{
rsAkey.setKey(rsKey);
rsAkey.updateLastUsedDate(new Date());
rsAkey.updateLastUpdatePname(WmsParam.HOST_SERVER_NAME);
reasonHandler.modify(rsAkey);
getConnection().commit();
}