Оркестровка между Wildfly и MySQL базы данных

Я использую docker-compose для запуска 1 контейнера с jboss wildfly 10 и другого с mysql. Если запуск контейнера mysql занимает некоторое время, и в этом случае wildfly выдает следующую ошибку:

12:42:35,612 WARN  [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] (ServerService Thread Pool -- 61) IJ000604: Throwable while attempting to get a new connection: null: javax.resource.ResourceException: IJ031084: Unable to create connection
...
 Caused by: java.net.UnknownHostException: db
...

и wilfly запускается (с ошибками):

12:42:40,346 ERROR [org.jboss.as] (Controller Boot Thread) WFLYSRV0026: WildFly Full 10.0.0.Final (WildFly Core 2.0.10.Final) started (with errors) in 14048ms - Started 492 of 818 services (57 services failed or missing dependencies, 383 services are lazy, passive or on-demand)

Когда контейнер mysql запускается позже, он не влияет на wildfly.

Мой docker-compose.yml это:

api:
    image: eu.gcr.io/jornaloficial-1265/pt.globaleda.jo-api
    environment:
      MYSQL_USER: service
      MYSQL_PASSWORD: service
      MYSQL_DATABASE: api
      MYSQL_HOST: db
    networks:
      - back
  db:
    image: mysql:5.7.11
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - back

Мой Dockerfile для API-сервисов:

FROM jboss/wildfly:10.0.0.Final
MAINTAINER José Meireles "[email protected]"

ADD mysql-connector-java-5.1.38-bin.jar /opt/jboss/wildfly/modules/system/layers/base/com/mysql/main/
ADD module.xml /opt/jboss/wildfly/modules/system/layers/base/com/mysql/main/
ADD keycloak-wildfly-adapter-dist-1.9.1.Final.tar.gz /opt/jboss/wildfly/
ADD standalone.xml /opt/jboss/wildfly/standalone/configuration/standalone.xml
ADD ato_template.odt /opt/jboss/
RUN mkdir /opt/jboss/pdf-src
RUN mkdir /opt/jboss/pdf-dest
ADD pdf-src /opt/jboss/pdf-src/
CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0"]
ADD api.war /opt/jboss/wildfly/standalone/deployments/

И конфигурация источника данных в моем standalone.xml:

                <datasource jndi-name="java:/mydb" pool-name="my_pool"
                    enabled="true" use-java-context="true">
                    <connection-url>jdbc:mysql://${env.MYSQL_HOST}/${env.MYSQL_DATABASE}?autoReconnect=true&amp;autoReconnectForPools=true&amp;useUnicode=yes&amp;characterEncoding=UTF-8&amp;useSSL=false</connection-url>
                    <driver>mysql</driver>
                    <security>
                        <user-name>${env.MYSQL_USER}</user-name>
                        <password>${env.MYSQL_PASSWORD}</password>
                    </security>
                    <validation>
                        <background-validation>true</background-validation>
                        <check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
                        <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/>
                        <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/>
                    </validation>
                </datasource>

Чтобы воспроизвести проблему:

docker-compose down
docker-compose up -d api
sleep 10
docker-compose up -d db
docker-compose logs 

Возможно ли, что Wildfly обнаружит, когда база данных готова, или как альтернативный сбой, и выйдет, если завершится работа подсистемы источника данных? В этом последнем случае я могу использовать скрипт, который запускает wildfly в цикле

1 ответ

Конфигурация источника данных WildFly предлагает возможность проверки соединений. В графическом интерфейсе управления выберите Конфигурация -> Подсистемы -> Источники данных -> Не-XA -> ProcessEngine -> Просмотр. Выберите "Проверка" на вкладках на экране.

Нажмите на ссылку "Изменить". В поле "Check Valid Sql" введите следующее:

ВЫБЕРИТЕ 1

Я также отмечаю флажок "Проверка фона". Сохраните конфигурацию (может потребоваться сначала отключить источник данных и повторить этот процесс, и / или вам может потребоваться перезагрузить сервер).

Эта конфигурация выполняет постоянную проверку соединения с источником данных.

Еще одна вещь, которую вы можете сделать, это установить тайм-аут в Камунде (я думаю) для его источника данных, хотя я не могу сказать, как это делается. Я думаю, что это довольно терпимо.

Другие вопросы по тегам