Compartir a través de


Configuración de orígenes de datos para una aplicación Tomcat, JBoss o Java SE en Azure App Service

En este artículo se muestra cómo configurar orígenes de datos en una aplicación Java SE, Tomcat o JBoss en App Service.

Azure App Service ejecuta aplicaciones web Java en un servicio totalmente administrado en tres variantes:

  • Java SE: puede ejecutar una aplicación implementada como un paquete JAR que contenga un servidor incrustado (como Spring Boot, Dropwizard, Quarkus o uno con un servidor de Tomcat o Jetty incrustado).
  • Tomcat: el servidor de Tomcat integrado puede ejecutar una aplicación implementada como un paquete WAR.
  • JBoss EAP: admitido para aplicaciones Linux en los niveles de precios Premium v3 y Aislado v2. El servidor JBoss EAP integrado puede ejecutar una aplicación implementada como un paquete WAR o EAR.

Nota:

Para las aplicaciones de Spring, se recomienda usar Azure Spring Apps. No obstante, todavía puede usar Azure App Service como destino. Consulte guía de destino de carga de trabajo de Java para obtener consejos.

Configuración del origen de datos

Para conectarse a orígenes de datos en aplicaciones de Spring Boot, se recomienda crear cadenas de conexión e insertarlas en su archivo application.properties.

  1. En la sección "Configuración" de la página de App Service, establezca un nombre para la cadena, pegue la cadena de conexión de JDBC en el campo de valor y establezca el tipo en "Custom" (Personalizado). Opcionalmente, puede establecer esta cadena de conexión como configuración de ranura.

    Nuestra aplicación puede acceder a cadena de conexión como una variable de entorno denominada CUSTOMCONNSTR_<your-string-name>. Por ejemplo, CUSTOMCONNSTR_exampledb.

  2. En su archivo application.properties, haga referencia a esta cadena de conexión con el nombre de variable de entorno. En nuestro ejemplo, se usaría el siguiente código:

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

Para obtener más información, consulte la documentación de Spring Boot relativa al acceso a datos y configuraciones externalizadas .

Sugerencia

De forma predeterminada, los contenedores de Tomcat de Linux pueden configurar automáticamente orígenes de datos compartidos por usted en el servidor de Tomcat. Lo único que debe hacer es agregar una configuración de aplicación que contenga una cadena de conexión JDBC válida a una base de datos Oracle, SQL Server, PostgreSQL o MySQL (incluyendo las credenciales de conexión) y App Service agrega automáticamente la base de datos compartida que corresponde a /usr/local/tomcat/conf/context.xml para usted, mediante un controlador adecuado disponible en el contenedor. Para ver un escenario completo mediante este enfoque, consulte Tutorial: Compilación de una aplicación web de Tomcat con Azure App Service en Linux y MySQL.

Estas instrucciones se aplican a todas las conexiones de base de datos. Debe rellenar los marcadores de posición con el nombre de clase de controlador de la base de datos elegido y con el archivo JAR. Se proporciona una tabla con los nombres de clase y las descargas de controladores de las bases de datos más habituales.

Base de datos Nombre de clase de controlador Controlador JDBC
PostgreSQL org.postgresql.Driver Descargar
MySQL com.mysql.jdbc.Driver Descargar (seleccione "Platform Independent")
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver Descargar

Para configurar Tomcat para que use Java Database Connectivity (JDBC) o Java Persistence API (JPA), personalice primero la variable de entorno CATALINA_OPTS que lee Tomcat al iniciarse. Establezca estos valores a través de un valor de la aplicación en el complemento de Maven de App Service:

<appSettings>
    <property>
        <name>CATALINA_OPTS</name>
        <value>"$CATALINA_OPTS -Ddbuser=${DBUSER} -Ddbpassword=${DBPASSWORD} -DconnURL=${CONNURL}"</value>
    </property>
</appSettings>

O bien establezca las variables de entorno en la página Configuración>Configuración de la aplicación de Azure Portal.

A continuación, determine si el origen de datos debe estar disponible para una aplicación o para todas las aplicaciones que se ejecutan en el servlet de Tomcat.

Orígenes de datos de nivel de aplicación

  1. Cree un archivo context.xml en el directorio META-INF / del proyecto. Si el directorio META-INF/ no existe, créelo.

  2. En , context.xml, agregue un elemento Context para vincular el origen de datos a una dirección JNDI. Reemplace el marcador de posición driverClassName por el nombre de clase de su controlador de la tabla anterior.

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. Actualice el archivo web.xml de la aplicación para que use el origen de datos de su aplicación.

    <resource-env-ref>
        <resource-env-ref-name>jdbc/dbconnection</resource-env-ref-name>
        <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
    </resource-env-ref>
    

Recursos de nivel de servidor compartidos

No puede modificar directamente una instalación de Tomcat para la configuración de todo el servidor porque la ubicación de instalación es de solo lectura. Para realizar cambios de configuración de nivel de servidor en la instalación de Windows Tomcat, la manera más sencilla es hacer lo siguiente en el inicio de la aplicación:

  1. Copie Tomcat en un directorio local (%LOCAL_EXPANDED%) y úselo como CATALINA_BASE (consulte la documentación de Tomcat sobre esta variable).
  2. Agregue los orígenes de datos compartidos al %LOCAL_EXPANDED%\tomcat\conf\server.xml usando la transformación XSL.

Adición de un archivo de inicio

Cree un archivo denominado directorio startup.cmd %HOME%\site\wwwroot. Se ejecutará automáticamente antes de que se inicie el servidor de Tomcat. El archivo debe tener el siguiente contenido:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File  %HOME%\site\configure.ps1

Adición del Script de configuración de PowerShell

A continuación, agregue el script de configuración denominado configure.ps1 al directorio %HOME%_\site con el código siguiente:

# Locations of xml and xsl files
$target_xml="$Env:LOCAL_EXPANDED\tomcat\conf\server.xml"
$target_xsl="$Env:HOME\site\server.xsl"

# Define the transform function
# Useful if transforming multiple files
function TransformXML{
    param ($xml, $xsl, $output)

    if (-not $xml -or -not $xsl -or -not $output)
    {
        return 0
    }

    Try
    {
        $xslt_settings = New-Object System.Xml.Xsl.XsltSettings;
        $XmlUrlResolver = New-Object System.Xml.XmlUrlResolver;
        $xslt_settings.EnableScript = 1;

        $xslt = New-Object System.Xml.Xsl.XslCompiledTransform;
        $xslt.Load($xsl,$xslt_settings,$XmlUrlResolver);
        $xslt.Transform($xml, $output);
    }

    Catch
    {
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName
        echo  'Error'$ErrorMessage':'$FailedItem':' $_.Exception;
        return 0
    }
    return 1
}

# Start here

# Check for marker file indicating that config has already been done
if(Test-Path "$Env:LOCAL_EXPANDED\tomcat\config_done_marker"){
    return 0
}

# Delete previous Tomcat directory if it exists
# In case previous config isn't completed or a new config should be forcefully installed
if(Test-Path "$Env:LOCAL_EXPANDED\tomcat"){
    Remove-Item "$Env:LOCAL_EXPANDED\tomcat" Recurse
}

md -Path "$Env:LOCAL_EXPANDED\tomcat"

# Copy Tomcat to local
# Using the environment variable $AZURE_TOMCAT90_HOME uses the 'default' version of Tomcat
New-Item "$Env:LOCAL_EXPANDED\tomcat" -ItemType Directory
Copy-Item -Path "$Env:AZURE_TOMCAT90_HOME\*" "$Env:LOCAL_EXPANDED\tomcat" -Recurse

# Perform the required customization of Tomcat
$success = TransformXML -xml $target_xml -xsl $target_xsl -output $target_xml

# Mark that the operation was a success if successful
if($success){
    New-Item -Path "$Env:LOCAL_EXPANDED\tomcat\config_done_marker" -ItemType File
}

Este PowerShell completa los pasos siguientes:

  1. Compruebe si ya existe una copia personalizada de Tomcat. De ser así, el script de inicio puede terminar aquí.
  2. Copie Tomcat localmente.
  3. Agregue orígenes de datos compartidos a la configuración personalizada de Tomcat mediante la transformación XSL.
  4. Indique que la configuración se completó correctamente.

Adición de un archivo de transformación XSL

Un caso de uso común para personalizar la instalación integrada de Tomcat es modificar los archivos de configuración de Tomcat server.xml, context.xml o web.xml. App Service ya modifica estos archivos para proporcionar características de la plataforma. Para seguir usando estas características, es importante conservar el contenido de estos archivos al realizar cambios en ellos. Para ello, use una transformación XSL (XSLT).

Agregue un archivo de transformación XSL denominado configure.ps1 al directorio %HOME%_\site. Puede usar el siguiente código de transformación XSL para agregar un nuevo nodo de conector a server.xml. La transformación de identidad al principio conserva el contenido original del archivo de configuración.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <!-- Identity transform: this ensures that the original contents of the file are included in the new file -->
    <!-- Ensure that your transform files include this block -->
    <xsl:template match="@* | node()" name="Copy">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="@* | node()" mode="insertConnector">
      <xsl:call-template name="Copy" />
    </xsl:template>

    <xsl:template match="comment()[not(../Connector[@scheme = 'https']) and
                                   contains(., '&lt;Connector') and
                                   (contains(., 'scheme=&quot;https&quot;') or
                                    contains(., &quot;scheme='https'&quot;))]">
      <xsl:value-of select="." disable-output-escaping="yes" />
    </xsl:template>

    <xsl:template match="Service[not(Connector[@scheme = 'https'] or
                                     comment()[contains(., '&lt;Connector') and
                                               (contains(., 'scheme=&quot;https&quot;') or
                                                contains(., &quot;scheme='https'&quot;))]
                                    )]
                        ">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()" mode="insertConnector" />
      </xsl:copy>
    </xsl:template>

    <!-- Add the new connector after the last existing Connnector if there's one -->
    <xsl:template match="Connector[last()]" mode="insertConnector">
      <xsl:call-template name="Copy" />

      <xsl:call-template name="AddConnector" />
    </xsl:template>

    <!-- ... or before the first Engine if there's no existing Connector -->
    <xsl:template match="Engine[1][not(preceding-sibling::Connector)]"
                  mode="insertConnector">
      <xsl:call-template name="AddConnector" />

      <xsl:call-template name="Copy" />
    </xsl:template>

    <xsl:template name="AddConnector">
      <!-- Add new line -->
      <xsl:text>&#xa;</xsl:text>
      <!-- This is the new connector -->
      <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
                 maxThreads="150" scheme="https" secure="true" 
                 keystoreFile="${{user.home}}/.keystore" keystorePass="changeit"
                 clientAuth="false" sslProtocol="TLS" />
    </xsl:template>

</xsl:stylesheet>

Establecimiento de la configuración de aplicación CATALINA_BASE

La plataforma también debe saber dónde está instalada la versión personalizada de Tomcat. Puede establecer la ubicación de la instalación en el valor de configuración CATALINA_BASE de la aplicación.

Puede usar la CLI de Azure para cambiar este valor:

    az webapp config appsettings set -g $MyResourceGroup -n $MyUniqueApp --settings CATALINA_BASE="%LOCAL_EXPANDED%\tomcat"

O bien, puede cambiar manualmente la configuración en Azure Portal:

  1. Vaya a Configuración>Configuración>Configuración de la aplicación.
  2. Seleccione Nueva configuración de la aplicación.
  3. Use estos valores para crear la configuración:
    1. Nombre: CATALINA_BASE
    2. Valor: "%LOCAL_EXPANDED%\tomcat"

Finalización de la configuración

Por último, coloque los archivos JAR del controlador en la classpath de Tomcat y reinicie App Service. Asegúrese de que los archivos del controlador JDBC estén disponibles para el cargador de clases de Tomcat. Para ello, colóquelos en el directorio /home/site/lib. En Cloud Shell, ejecute az webapp deploy --type=lib para cada archivo JAR del controlador:

az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --target-path <jar-name>.jar

Al registrar un origen de datos en JBoss EAP, hay tres pasos fundamentales: cargar el controlador JDBC, agregarlo como un módulo y registrar el módulo. App Service es un servicio de hospedaje sin estado, por lo que los comandos de configuración para agregar y registrar el módulo de origen de datos deben incluirse en un script y aplicarse cuando se inicie el contenedor.

  1. Obtenga el controlador JDBC de la base de datos.

  2. Cree un archivo de definición de módulo XML para el controlador JDBC. En el ejemplo siguiente se muestra una definición de módulo para PostgreSQL.

    <?xml version="1.0" ?>
    <module xmlns="urn:jboss:module:1.1" name="org.postgres">
        <resources>
        <!-- ***** IMPORTANT : REPLACE THIS PLACEHOLDER *******-->
        <resource-root path="/home/site/deployments/tools/postgresql-42.2.12.jar" />
        </resources>
        <dependencies>
            <module name="javax.api"/>
            <module name="javax.transaction.api"/>
        </dependencies>
    </module>
    
  3. Coloque los comandos de la CLI de JBoss en un archivo denominado jboss-cli-commands.cli. Los comandos de JBoss deben agregar el módulo y registrarlo como un origen de datos. En el ejemplo siguiente se muestran los comandos de la CLI de JBoss para PostgreSQL.

    #!/usr/bin/env bash
    module add --name=org.postgres --resources=/home/site/deployments/tools/postgresql-42.2.12.jar --module-xml=/home/site/deployments/tools/postgres-module.xml
    
    /subsystem=datasources/jdbc-driver=postgres:add(driver-name="postgres",driver-module-name="org.postgres",driver-class-name=org.postgresql.Driver,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)
    
    data-source add --name=postgresDS --driver-name=postgres --jndi-name=java:jboss/datasources/postgresDS --connection-url=${POSTGRES_CONNECTION_URL,env.POSTGRES_CONNECTION_URL:jdbc:postgresql://db:5432/postgres} --user-name=${POSTGRES_SERVER_ADMIN_FULL_NAME,env.POSTGRES_SERVER_ADMIN_FULL_NAME:postgres} --password=${POSTGRES_SERVER_ADMIN_PASSWORD,env.POSTGRES_SERVER_ADMIN_PASSWORD:example} --use-ccm=true --max-pool-size=5 --blocking-timeout-wait-millis=5000 --enabled=true --driver-class=org.postgresql.Driver --exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter --jta=true --use-java-context=true --valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker
    
  4. Cree un script de inicio, startup_script.sh, que llame a los comandos de la CLI de JBoss. En el ejemplo siguiente se muestra cómo llamar a su jboss-cli-commands.cli. Más adelante, configurará App Service para ejecutar este script cuando se inicie el contenedor.

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/deployments/tools/jboss-cli-commands.cli
    
  5. Mediante el cliente FTP de su elección, cargue el controlador JDBC, jboss-cli-commands.cli, startup_script.sh y la definición del módulo en /site/deployments/tools/.

  6. Configure el sitio para que ejecute startup_script.sh cuando se inicie el contenedor. En Azure Portal, vaya a Configuración>Configuración general>Comando de inicio. Establezca el campo de comando de inicio en /home/site/deployments/tools/startup_script.sh. Guarde los cambios mediante Guardar.

Para confirmar que el origen de datos se agregó al servidor JBoss, conéctese a su aplicación web mediante SSH y ejecute $JBOSS_HOME/bin/jboss-cli.sh --connect. Cuando se conecte a JBoss, ejecute /subsystem=datasources:read-resource para imprimir una lista de los orígenes de datos.

Pasos siguientes

Visite el centro de Azure para desarrolladores de Java para encontrar guías de inicio rápido de Azure, tutoriales y documentación de referencia de Java.