Connessioni SQL con JDBC DataSourcePool

Le connessioni ai database SQL (e ad altri servizi non HTTP/HTTPS) devono essere proxy fuori AEM, compresi quelli effettuati utilizzando AEM servizio OSGi DataSourcePool per gestire le connessioni.

Supporto di rete avanzato

L'esempio di codice seguente è supportato dalle seguenti opzioni di rete avanzate.

Assicurati che appropriato la configurazione di rete avanzata è stata impostata prima di seguire questa esercitazione.

Nessuna rete avanzata Uscita porta flessibile Indirizzo IP in uscita dedicato Rete privata virtuale

Configurazione OSGi

La stringa di connessione della configurazione OSGi utilizza:

  • AEM_PROXY_HOST tramite Variabile di ambiente di configurazione OSGi $[env:AEM_PROXY_HOST;default=proxy.tunnel] come host della connessione
  • 30001 che è portOrig valore per la mappatura a termine della porta di Cloud Manager 30001mysql.example.com:3306

Poiché i segreti non devono essere memorizzati nel codice, è consigliabile fornire il nome utente e la password della connessione SQL tramite le variabili di configurazione OSGi, impostate utilizzando AIO CLI o le API Cloud Manager.

  • ui.config/src/jcr_root/apps/wknd-examples/osgiconfig/config/com.day.commons.datasource.jdbcpool.JdbcPoolService~wknd-examples-mysql.cfg.json
{
  "datasource.name": "wknd-examples-mysql",
  "jdbc.driver.class": "com.mysql.jdbc.Driver",
  "jdbc.connection.uri": "jdbc:mysql://$[env:AEM_PROXY_HOST;default=proxy.tunnel]:30001/wknd-examples",
  "jdbc.username": "$[env:MYSQL_USERNAME;default=mysql-user]",
  "jdbc.password": "$[secret:MYSQL_PASSWORD]"
}

I seguenti aio CLI può essere utilizzato per impostare i segreti OSGi in base all'ambiente:

$ aio cloudmanager:set-environment-variables --programId=<PROGRAM_ID> <ENVIRONMENT_ID> --secret MYSQL_USERNAME "mysql-user" --secret MYSQL_PASSWORD "password123"

Esempio di codice

Questo esempio di codice Java™ è di un servizio OSGi che effettua una connessione a un database MySQL esterno tramite AEM servizio OSGi DataSourcePool.
La configurazione di fabbrica OSGi DataSourcePool a sua volta specifica una porta (30001) mappata tramite portForwards nella regola enableEnvironmentAdvancedNetworkingConfiguration funzionamento all'host e alla porta esterni, mysql.example.com:3306.

...
"portForwards": [{
    "name": "mysql.example.com",
    "portDest": 3306,
    "portOrig": 30001
}]
...
  • core/src/com/adobe/aem/wknd/examples/connections/impl/JdbcExternalServiceImpl.java
package com.adobe.aem.wknd.examples.core.connections.impl;

import com.adobe.aem.wknd.examples.core.connections.ExternalService;
import com.day.commons.datasource.poolservice.DataSourceNotFoundException;
import com.day.commons.datasource.poolservice.DataSourcePool;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@Component
public class JdbcExternalServiceImpl implements ExternalService {
    private static final Logger log = LoggerFactory.getLogger(JdbcExternalServiceImpl.class);

    @Reference
    private DataSourcePool dataSourcePool;

    // The datasource.name value of the OSGi configuration containing the connection this OSGi component will use.
    private static final String DATA_SOURCE_NAME = "wknd-examples-mysql";

    @Override
    public boolean isAccessible() {

        try {
            // Get the JDBC data source based on the named OSGi configuration
            DataSource dataSource = (DataSource) dataSourcePool.getDataSource(DATA_SOURCE_NAME);

            // Establish a connection with the external JDBC service
            // Per the OSGi configuration, this will use the injected $[env:AEM_PROXY_HOST] value as the host
            // and the port (30001) mapped via Cloud Manager API call
            try (Connection connection = dataSource.getConnection()) {

                // Validate the connection
                connection.isValid(1000);

                // Close the connection, since this is just a simple connectivity check
                connection.close();

                // Return true if AEM could reach the external JDBC service
                return true;
            } catch (SQLException e) {
                log.error("Unable to validate SQL connection for [ {} ]", DATA_SOURCE_NAME, e);
            }
        } catch (DataSourceNotFoundException e) {
            log.error("Unable to establish an connection with the JDBC data source [ {} ]", DATA_SOURCE_NAME, e);
        }

        return false;
    }
}

Dipendenze dei driver MySQL

AEM as a Cloud Service spesso richiede di fornire driver di database Java™ per supportare le connessioni. Fornire i driver è generalmente meglio ottenuto incorporando gli artefatti del bundle OSGi contenenti questi driver al progetto AEM tramite il all pacchetto.

Reattore pom.xml

Includere le dipendenze del driver di database nel reattore pom.xml e poi fai riferimento a loro nel all sottoprogetti.

  • pom.xml
...
<dependencies>
    ...
    <!-- MySQL Driver dependencies -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>[8.0.27,)</version>
        <scope>provided</scope>
    </dependency>
    ...
</dependencies>
...

Tutto pom.xml

Incorporare gli artefatti di dipendenza del driver di database in all Il pacchetto viene distribuito e disponibile su AEM as a Cloud Service. Questi artefatti deve essere bundle OSGi che esportano la classe Java™ del driver di database.

  • all/pom.xml
...
<embededs>
    ...
    <!-- Include the MySQL Driver OSGi bundles for deployment to the project -->
    <embedded>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <target>/apps/wknd-examples-vendor-packages/application/install</target>
    </embedded>
    ...
</embededs>

...

<dependencies>
    ...
    <!-- Add MySQL OSGi bundle artifacts so the <embeddeds> can add them to the project -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>provided</scope>
    </dependency>
    ...
</dependencies>
...

In questa pagina