Назад | Перейти на главную страницу

WildFly run-batch: запуск всех развертываний с зависимостями

У меня есть сервер WildFly 10, на котором установлено около 12 развертываний, и список развертываний может периодически меняться. Основная проблема в том, что когда я перезапускаю сервер, приложения пытаются развернуть одновременно. Однако большинство приложений не может запуститься, пока не будут запущены другие развертывания. Фактически, у них есть строгая последовательность выполнения. Таким образом, при перезапуске сервера Wildfly часть развертывания будет запущена с ошибкой и работать не будет. Придумал хак:

  1. Остановите серверный процесс WildFly
  2. В standalone.xml для всех развертываний установлен статус отключения (с помощью команды cli)
  3. Запускаем сервер WildFly
  4. Запускаем скрипт:
    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.