Connexions SQL à l’aide de JDBC DataSourcePool
Les connexions à des bases de données SQL (et à d’autres services non HTTP/HTTPS) doivent être traitées par proxy hors AEM, y compris celles créées à l’aide du service OSGi DataSourcePool pour gérer les connexions.
Prise en charge de la mise en réseau avancée
L’exemple de code suivant est pris en charge par les options de mise en réseau avancée suivantes.
Assurez-vous que la configuration de mise en réseau avancée appropriée a été définie avant de suivre ce tutoriel.
Configuration OSGi
La chaîne de connexion de la configuration OSGi utilise :
- La valeur
AEM_PROXY_HOST
via la variable d’environnement de configuration OSGi$[env:AEM_PROXY_HOST;default=proxy.tunnel]
comme hôte de la connexion 30001
qui est la valeurportOrig
du mappage du transfert de port Cloud Manager30001
→mysql.example.com:3306
.
Puisque les secrets ne doivent pas être stockés dans le code, il vaut mieux fournir le nom d’utilisateur ou d’utilisatrice et le mot de passe de la connexion SQL via les variables de configuration OSGi, définies à l’aide de l’interface de ligne de commande AIO ou des 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]"
}
La commande aio CLI
suivante peut être utilisée pour définir les secrets OSGi par environnement :
$ aio cloudmanager:set-environment-variables --programId=<PROGRAM_ID> <ENVIRONMENT_ID> --secret MYSQL_USERNAME "mysql-user" --secret MYSQL_PASSWORD "password123"
Exemple de code
Cet exemple de code Java™ illustre un service OSGi qui établit une connexion à une base de données MySQL externe via le service OSGi DataSourcePool d’AEM.
La configuration d’usine OSGi DataSourcePool spécifie à son tour un port (30001
) qui est mappé via la règle portForwards
dans l’opération enableEnvironmentAdvancedNetworkingConfiguration sur l’hôte externe et le port, 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;
}
}
Dépendances des pilotes MySQL
AEM as a Cloud Service nécessite souvent que vous fournissiez des pilotes de base de données Java™ pour prendre en charge les connexions. Il est généralement préférable de fournir les pilotes en incorporant les artefacts de lot OSGi contenant ces pilotes dans le projet AEM via le package all
.
Réacteur pom.xml
Incluez les dépendances des pilotes de base de données dans le réacteur pom.xml
, puis référencez-les dans les sous-projets 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>
...
Tous les pom.xml
Intégrez les artefacts de dépendance des pilotes de base de données dans le package all
afin qu’ils soient déployés et disponibles sur AEM as a Cloud Service. Ces artefacts doivent être des lots OSGi qui exportent la classe Java™ du pilote de base de données.
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>
...