Connessioni SQL con DataSourcePool JDBC
Le connessioni ai database SQL (e ad altri servizi non HTTP/HTTPS) devono essere escluse dall'AEM, incluse quelle effettuate utilizzando il servizio OSGi DataSourcePool dell'AEM per gestire le connessioni.
Supporto di rete avanzato
Il codice di esempio seguente è supportato dalle seguenti opzioni di rete avanzate.
Prima di seguire questa esercitazione, assicurati che la configurazione di rete avanzata appropriata sia stata configurata.
Configurazione OSGi
La stringa di connessione della configurazione OSGi utilizza:
- Valore
AEM_PROXY_HOST
tramite la variabile di ambiente di configurazione OSGi$[env:AEM_PROXY_HOST;default=proxy.tunnel]
come host della connessione 30001
che è il valoreportOrig
per il mapping di inoltro delle porte Cloud Manager30001
→mysql.example.com:3306
Poiché i segreti non devono essere archiviati nel codice, è consigliabile fornire il nome utente e la password della connessione SQL tramite le variabili di configurazione OSGi, impostate con CLI AIO o 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]"
}
Il seguente comando 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 il servizio OSGi DataSourcePool dell’AEM.
La configurazione del factory OSGi DataSourcePool specifica a sua volta una porta (30001
) mappata tramite la regola portForwards
nell'operazione enableEnvironmentAdvancedNetworkingConfiguration 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 driver MySQL
AEM as a Cloud Service richiede spesso di fornire driver di database Java™ per supportare le connessioni. Il modo migliore per fornire i driver consiste in genere nell'incorporare gli artefatti del bundle OSGi contenenti questi driver nel progetto AEM tramite il pacchetto all
.
Reactor pom.xml
Includere le dipendenze dei driver di database nel reattore pom.xml
e fare riferimento a esse nei sottoprogetti all
.
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>
...
Tutti i file pom.xml
Incorporare gli artefatti di dipendenza del driver di database nel pacchetto all
in modo che siano distribuiti e disponibili in AEM as a Cloud Service. Questi artefatti devono 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>
...