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 effectuées à l’aide du service OSGi DataSourcePool pour gérer les connexions.
L’exemple de code suivant est pris en charge par les options de mise en réseau avancées suivantes.
Assurez-vous que la variable approprié une configuration réseau avancée a été configurée avant de suivre ce tutoriel.
Pas de mise en réseau avancée | Sortie de port flexible | Adresse IP sortante dédiée | Réseau privé virtuel |
---|---|---|---|
✘ | ✔ | ✔ | ✔ |
La chaîne de connexion de la configuration OSGi utilise :
AEM_PROXY_HOST
via la fonction Variable d’environnement de configuration OSGi $[env:AEM_PROXY_HOST;default=proxy.tunnel]
comme hôte de la connexion30001
qui correspond à la variable portOrig
valeur du mappage de transfert de port Cloud Manager 30001
→ mysql.example.com:3306
Puisque les secrets ne doivent pas être stockés dans le code, le nom d’utilisateur et le mot de passe de la connexion SQL sont mieux fournis 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]"
}
Les éléments suivants aio CLI
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"
Cet exemple de code Java™ illustre un service OSGi qui établit une connexion à une base de données MySQL externe via AEM service OSGi DataSourcePool.
La configuration d’usine OSGi DataSourcePool spécifie à son tour un port (30001
) qui est mappé via le portForwards
dans la enableEnvironmentAdvancedNetworkingConfiguration l'opération 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;
}
}
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 bundle OSGi contenant ces pilotes dans le projet AEM via le all
module.
Inclure les dépendances du pilote de base de données dans le réacteur pom.xml
puis référencez-les dans le all
sous-projets.
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>
...
Incorporation des artefacts de dépendance de pilote de base de données dans all
le module vers lequel ils sont déployés est disponible sur AEM as a Cloud Service. Ces artefacts must ê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>
...