У меня есть сервер WildFly 10, на котором установлено около 12 развертываний, и список развертываний может периодически меняться. Основная проблема в том, что когда я перезапускаю сервер, приложения пытаются развернуть одновременно. Однако большинство приложений не может запуститься, пока не будут запущены другие развертывания. Фактически, у них есть строгая последовательность выполнения. Таким образом, при перезапуске сервера 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 есть операция, которая все это делает «правильно» (генерирует последовательность запуска или что-то в этом роде)?
Как оказалось, такой подход работает через раз.
То есть в 50% случаев даже со второго раза не запускаются все приложения с таким скриптом.
Пришлось прибегнуть к формированию переменной, описывающей последовательность запуска приложений. Эта последовательность включает все возможные приложения, поэтому, если некоторые из них предустановлены, то это не проблема. Скрипт проверяет наличие приложений с помощью команды:
ls deployment -l
Затем он проверяет вывод со списком последовательностей и по очереди запускает те приложения, которые доступны в WildFly.