Connessioni SQL con API Java™
Le connessioni ai database SQL (e ad altri servizi non HTTP/HTTPS) devono essere escluse dall'AEM.
L'eccezione a questa regola si verifica quando l'indirizzo IP in uscita dedicato è in uso e il servizio è in Adobe o Azure.
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
Poiché i segreti non devono essere archiviati nel codice, è consigliabile fornire il nome utente e la password della connessione SQL tramite variabili di configurazione OSGi segrete, impostate con CLI AIO o API Cloud Manager.
ui.config/src/jcr_root/apps/wknd-examples/osgiconfig/com.adobe.aem.wknd.examples.core.connections.impl.MySqlExternalServiceImpl.cfg.json
{
"username": "$[env:MYSQL_USERNAME;default=mysql-user]",
"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™ fa parte di un servizio OSGi che effettua una connessione a un server Web SQL Server esterno tramite la seguente regola Cloud Manager portForwards
dell'operazione enableEnvironmentAdvancedNetworkingConfiguration.
...
"portForwards": [{
"name": "mysql.example.com",
"portDest": 3306,
"portOrig": 30001
}]
...
core/src/com/adobe/aem/wknd/examples/connections/impl/MySqlExternalServiceImpl.java
package com.adobe.aem.wknd.examples.core.connections.impl;
import com.adobe.aem.wknd.examples.core.connections.ExternalService;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.AttributeType;
import org.osgi.service.metatype.annotations.Designate;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.*;
@Component
@Designate(ocd = MySqlExternalServiceImpl.Config.class)
public class MySqlExternalServiceImpl implements ExternalService {
private static final Logger log = LoggerFactory.getLogger(MySqlExternalServiceImpl.class);
// Get the proxy host using the AEM_PROXY_HOST Java environment variable provided by AEM as a Cloud Service
private static final String PROXY_HOST = System.getenv().getOrDefault("AEM_PROXY_HOST", "proxy.tunnel");
// Use the port mapped to the external MySQL service in the Cloud Manager API call
private static final int PORT_FORWARDS_PORT_ORIG = 30001;
private Config config;
@Override
public boolean isAccessible() {
log.debug("MySQL connection URL: [ {} ]", getConnectionUrl(config));
// Establish a connection with the external MySQL service
// This MySQL connection URL is created in getConnection(..) which will use the AEM_PROXY_HOST is it exists, and the proxied port.
try (Connection connection = DriverManager.getConnection(getConnectionUrl(config), config.username(), config.password())) {
// 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 SQL service
return true;
} catch (SQLException e) {
log.error("Unable to establish an connection with MySQL service using connection URL [ {} ]", getConnectionUrl(config), e);
}
return false;
}
/**
* Create a connection string to the MySQL using the AEM-provided AEM_PROXY_HOST and portForwards.portOrg port
* defined in the Cloud Manager API mapping.
*
* @param config OSGi configuration object
* @return the MySQL connection URI
*/
private String getConnectionUrl(Config config) {
return String.format("jdbc:mysql://%s:%d/wknd-examples", PROXY_HOST, PORT_FORWARDS_PORT_ORIG);
}
@Activate
protected void activate(Config config) throws ClassNotFoundException, SQLException {
this.config = config;
// Load the required MySQL Driver class required for Java to make the connection
// The OSGi bundle that contains this driver is deployed via the project's all project
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
}
@ObjectClassDefinition
@interface Config {
@AttributeDefinition(type = AttributeType.STRING)
String username();
@AttributeDefinition(type = AttributeType.STRING)
String password();
}
}
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>
...