As conexões com bancos de dados SQL (e outros serviços não HTTP/HTTPS) devem ser extraídas do AEM, incluindo as feitas usando AEM serviço OSGi DataSourcePool para gerenciar as conexões.
O código de exemplo a seguir é suportado pelas seguintes opções avançadas de rede.
Verifique se a variável adequada a configuração avançada de rede foi configurada antes de seguir este tutorial.
Sem rede avançada | Saída flexível da porta | Endereço IP de saída dedicado | Rede privada virtual |
---|---|---|---|
✘ | ✔ | ✔ | ✔ |
A cadeia de conexão da configuração OSGi usa:
AEM_PROXY_HOST
por meio da Variável do ambiente de configuração OSGi $[env:AEM_PROXY_HOST;default=proxy.tunnel]
como o host da conexão30001
que é o portOrig
valor do mapeamento de encaminhamento da porta do Cloud Manager 30001
→ mysql.example.com:3306
Como os segredos não devem ser armazenados no código, o nome de usuário e a senha da conexão SQL são melhor fornecidos por meio das variáveis de configuração OSGi, definidas usando AIO CLI ou APIs do 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]"
}
O seguinte aio CLI
pode ser usado para definir os segredos do OSGi com base no ambiente:
$ aio cloudmanager:set-environment-variables --programId=<PROGRAM_ID> <ENVIRONMENT_ID> --secret MYSQL_USERNAME "mysql-user" --secret MYSQL_PASSWORD "password123"
Este exemplo de código Java™ é de um serviço OSGi que faz uma conexão com um banco de dados MySQL externo por meio AEM serviço OSGi DataSourcePool.
A configuração de fábrica OSGi do DataSourcePool, por sua vez, especifica uma porta (30001
) que é mapeado por meio do portForwards
na enableEnvironmentAdvancedNetworkingConfiguration operação no host e na porta externos, 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 geralmente exige que você forneça drivers de banco de dados Java™ para suportar as conexões. Geralmente, é melhor fornecer os drivers incorporando os artefatos do pacote OSGi que contêm esses drivers ao projeto do AEM por meio do all
pacote.
Incluir as dependências do driver do banco de dados no reator pom.xml
e, em seguida, referenciá-las no all
subprojetos.
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>
...
Incorpore os artefatos de dependência do driver do banco de dados no all
para que sejam implantados e disponibilizados AEM as a Cloud Service. Esses artefatos must ser pacotes OSGi que exportam a classe Java™ do driver de banco de dados.
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>
...