我有一台 WildFly 10 服务器,其中安装了大约 12 个部署,部署列表可能会定期更改。主要问题是,当我重新启动服务器时,应用程序会尝试同时部署。但是,大多数应用程序无法启动,直到启动其他部署。事实上,它们有严格的运行顺序。因此,当 Wildfly 服务器重新启动时,部分部署将以错误的方式启动并且无法工作。我想到了一些技巧:
- 停止服务器进程 WildFly
- 在standalone.xml中,所有部署设置为禁用状态(通过cli命令)
- 启动 WildFly 服务器
- 运行脚本:
export JAVA_HOME=/usr/java/jdk1.8.0_131
export WILDFLY_HOME=/opt/wildfly
PATH=$WILDFLY_HOME/bin:$PATH
jcli=$WILDFLY_HOME/bin/jboss-cli.sh
args="--connect --controller=`hostname`:9990"
modules=`$jcli $args --command="ls deployment -l" | sed 's/\(.*\)/deploy --name=\1/'`
if [ -z "${modules// /}" ]
then
echo "Nothing to start on this server `hostname`"
exit 0
fi
$jcli $args <<EOF
batch
$modules
run-batch --headers={allow-resource-service-restart=true}
EOF
同时,当我第一次从 4 个点运行脚本时,我收到错误:ClassNotFoundException 和 NoClassDefFoundError。没有部署启动。但如果我第二次运行此脚本 - 一切都会启动。
其实问题是,第二次一切是如何开始的?有没有办法让它更简单,没有错误,也许 CLI 中有一个操作可以“正确”地完成所有这些操作(生成启动序列或类似的东西)?
答案1
事实证明,这种方法每次都有效。
也就是说,在50%的情况下,即使从第二次开始,所有的应用程序都不会以这样的脚本启动。
我不得不求助于一个变量的形成,该变量描述了启动应用程序的顺序。此顺序包括所有可能的应用程序,因此如果其中一些是预先安装的,那么这不是问题。脚本通过以下命令检查应用程序:
ls deployment -l
接下来,它使用序列列表检查输出,并依次启动 WildFly 上可用的应用程序。