Configuração

Este tópico fornece detalhes sobre compatibilidade, configurações avançadas e add-ons para o Oracle Cloud Infrastructure SDK for Java.

Este tópico fornece detalhes sobre compatibilidade, configurações avançadas e add-ons para o Oracle Cloud Infrastructure SDK for Java.

Permissões do Gerenciador de Segurança

Se o seu aplicativo precisar ser executado no Gerenciador de Segurança do Java, você deverá conceder permissões adicionais atualizando um arquivo de política ou especificando um arquivo de política adicional ou específico durante o runtime.

O SDK requer as seguintes permissões:

  • Obrigatório para Jersey:

    
    permission java.lang.RuntimePermission "getClassLoader";
    permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
    permission java.lang.RuntimePermission "accessDeclaredMembers";
    permission java.util.PropertyPermission "*", "read,write";
    permission java.lang.RuntimePermission "setFactory";
  • Obrigatório para o SDK substituir cabeçalhos reservados:

    permission java.util.PropertyPermission "sun.net.http.allowRestrictedHeaders", "write";
  • Obrigatório para o SDK abrir conexões de soquete:

    permission java.net.SocketPermission "*", "connect";

Para incluir outro arquivo de política, além do arquivo de política padrão do JRE (Java Runtime Environment), inicie a JVM (Java Virtual Machine) com:

java -Djava.security.manager -Djava.security.policy=</path/to/other_policy>

Para substituir o arquivo de política padrão, inicie o Java Virtual Machine com:

java -Djava.security.manager -Djava.security.policy==</path/to/other_policy>
Observação

Use um sinal de igual (=) ao fornecer um arquivo de política adicional. Só use um sinal de igual (==) duplo se quiser substituir o arquivo de política padrão.

TTL da JVM (Java Virtual Machine) para Pesquisas de Nome do DNS

A JVM (Java Virtual Machine) armazena no cache as respostas do DNS para pesquisas por um tempo definido, chamado TTL (time-to-live). Isso garante um tempo de resposta mais rápido no código que requer uma resolução frequente de nomes.

A JVM usa a propriedade networkaddress.cache.ttl para especificar a política de cache destinada a pesquisas de nomes de DNS. O valor é um número inteiro que representa o número de segundos para armazenar no cache a pesquisa bem-sucedida. O valor padrão para muitas JVMs, -1, indica que a pesquisa deve ser armazenada no cache para sempre.

Como os recursos do Oracle Cloud Infrastructure usam nomes de DNS que podem ser alterados, recomendamos que você altere o valor de TTL para 60 segundos. Isso garante que o novo endereço IP do recurso seja retornado na próxima consulta de DNS. Você pode alterar esse valor de forma global ou específica para o seu aplicativo:

  • Para definir o TTL globalmente em relação a todos os aplicativos que usam a JVM, adicione o seguinte código no arquivo $JAVA_HOME/jre/lib/security/java.security:

    networkaddress.cache.ttl=60
  • Para definir o TTL somente em relação ao seu aplicativo, inclua o seguinte no código de inicialização do aplicativo:

    java.security.Security.setProperty("networkaddress.cache.ttl" , "60");

Usando o Padrão de Jersey HttpUrlConnectorProvider

A partir da versão 2.0.0, o SDK para Java suporta o uso do Jersey ApacheConnectorProvider em vez do Jersey padrão HttpUrlConnectorProvider para permitir que o Apache HttpClient faça chamadas de serviço do OCI.

Para alterar para o conector padrão Jersey no nível do cliente

No nível do cliente, o SDK fornece a seguinte maneira de alternar de volta para o conector padrão Jersey antigo:

ObjectStorageClient nonBufferingObjectStorageClient = ObjectStorageClient
        .builder()
        .clientConfigurator(builder -> {
            builder.property(JerseyClientProperties.USE_APACHE_CONNECTOR, false);
        })
        // ...
        .build(provider);
Observação

A substituição da propriedade clientConfigurator do cliente reverterá para os padrões Jersey. Para configurar o clientConfigurator com o uso do Apache Connector, use additionalClientConfigurator ou additionalClientConfigurators.

Para alterar para o conector padrão Jersey no nível global

É possível excluir as dependências do Apache HttpClient ou usar uma variável de ambiente. Excluindo Dependências HttpClient

Se você mesmo estiver gerenciando dependências:

  • Remova os JARs org.apache.httpcomponents.httpclient e org.glassfish.jersey.connectors.jersey-apache-connector do classpath

Se você estiver usando o Maven para gerenciar suas dependências:

  • Adicione exclusões para as dependências org.apache.httpcomponents.httpclient e org.glassfish.jersey.connectors.jersey-apache-connector.
    • Para adicionar uma exclusão se você usar o Jersey 2:

      <dependencies>
          ...
          <dependency>
              <groupId>com.oracle.oci.sdk</groupId>
              <artifactId>oci-java-sdk-common-httpclient-jersey</artifactId>
              <version>...</version>
              <exclusions>
                  <exclusion>
                      <groupId>org.glassfish.jersey.connectors</groupId>
                      <artifactId>jersey-apache-connector</artifactId>
                  </exclusion>
                  <exclusion>
                      <groupId>org.apache.httpcomponents</groupId>
                      <artifactId>httpclient</artifactId>
                  </exclusion>
              </exclusions>
          </dependency>
          ...
      <dependencies> 
    • Para adicionar uma exclusão se você usar Jersey 3:

      <dependencies>
          ...
          <dependency>
              <groupId>com.oracle.oci.sdk</groupId>
              <artifactId>oci-java-sdk-common-httpclient-jersey3</artifactId>
              <version>...</version>
              <exclusions>
                  <exclusion>
                      <groupId>org.glassfish.jersey.connectors</groupId>
                      <artifactId>jersey-apache-connector</artifactId>
                  </exclusion>
                  <exclusion>
                      <groupId>org.apache.httpcomponents</groupId>
                      <artifactId>httpclient</artifactId>
                  </exclusion>
              </exclusions>
          </dependency>
          ...
      <dependencies>
Alternando de volta com uma variável de ambiente

O SDK para Java fornece uma variável de ambiente para alternar de volta para o conector padrão Jersey antigo no nível global. Defina o valor da variável de ambiente OCI_JAVASDK_JERSEY_CLIENT_DEFAULT_CONNECTOR_ENABLED como true. Por padrão, esse valor é definido como false.

Desativando o fechamento automático de streams

Para chamadas de API que retornam resposta binária/stream, o SDK fechará automaticamente o stream assim que ele tiver sido totalmente lido. Isso ocorre porque o SDK para Java suporta o Apache Connector para enviar solicitações e gerenciar conexões com o serviço. Por padrão, o Apache Connector suporta pool de conexões. Nos casos em que o stream da resposta não está fechado, as conexões não são liberadas do pool.

Para desativar o comportamento de fechamento automático, chame ResponseHelper.shouldAutoCloseResponseInputStream(false).

Escolhendo estratégias de fechamento de conexão com o Apache Connector para otimizar o desempenho

O Apache Connector suporta duas estratégias de fechamento de conexão: ApacheConnectionClosingStrategy.GracefulClosingStrategy e ApacheConnectionClosingStrategy.ImmediateClosingStrategy.

Ao usar ApacheConnectionClosingStrategy.GracefulClosingStrategy, os streams retornados de uma resposta são lidos até o final do stream ao fechá-lo. Isso pode introduzir um tempo adicional ao fechar o stream com uma leitura parcial, dependendo do tamanho do stream restante. Para evitar esse atraso, considere o uso de ApacheConnectionClosingStrategy.ImmediateClosingStrategy para arquivos grandes com leituras parciais. Observe que ApacheConnectionClosingStrategy.ImmediateClosingStrategy leva mais tempo ao usar a leitura parcial para um tamanho de stream menor (streams inferiores a 1 MB).

Observação

Se essas estratégias de fechamento de Conexão do Apache não fornecerem os resultados ideais para seus casos de uso, você poderá alternar de volta para o Padrão Jersey HttpUrlConnectorProvider usando o método mencionado acima.

Para obter mais informações, consulte: https://github.com/oracle/oci-java-sdk/blob/master/ApacheConnector-README.md.

Usando BC-FIPS em vez de Bouncy Castle

Se precisar de conformidade com o FIPS, faça download e use uma versão certificada pelo FIPS. O SDK suporta bc-fips 1.0.2 e bcpkix-fips 1.0.3. Você pode fazer o download de ambos em: https://www.bouncycastle.org/fips-java/

Para obter ajuda para instalar e configurar o Bouncy Castle FIPS, consulte a "Documentação do BC FIPS" em Guias do Usuário e Política de Segurança da Documentação do Bouncy Castle.

Dependências Autogerenciadas

Se você mesmo estiver gerenciando dependências:

  1. Remova os arquivos jar não FIPS Bouncy Castle do classpath:
    1. bcprov-jdk15on-1.60.jar
    2. bcpkix-jdk15on-1.60.jar
  2. Adicione os arquivos jar do FIPS Bouncy Castle ao classpath em vez disso:
    1. bc-fips-1.0.2.jar
    2. bcpkix-fips-1.0.3.jar

Dependências Gerenciadas pelo Maven

Se você estiver usando o Maven para gerenciar suas dependências:

  1. Adicione as versões corretas de bc-fips e bcpkix-fips às suas dependências:
    <dependencies>
      . . .
      <dependency>
        <groupId>bc-fips</groupId>
        <artifactId>bc-fips</artifactId>
        <version>1.0.2</version>
      </dependency>
      <dependency>
        <groupId>bcpkix-fips</groupId>
        <artifactId>bcpkix-fips</artifactId>
        <version>1.0.3</version>
      </dependency>
      . . .
    </dependencies>
  2. Como você está dependendo de um pacote oci-java-sdk*, remova as dependências que não são do FIPS Bouncy Castle:
    <dependencies>
      . . .
      <dependency>
        <groupId>com.oracle.oci.sdk</groupId>
        <artifactId>oci-java-sdk-common</artifactId>
        <version> . . . </version>
        <exclusions>
          <exclusion>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpkix-jdk15on</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      . . .
    </dependencies>

Usando a Sua Própria Implementação JAX-RS

O SDK para Java faz parte do Jersey, mas você também pode usar a sua própria implementação JAX-RS.

Add-On Configurador de Cliente do RESTEasy

O oci-java-sdk-addons-resteasy-client-configurator é fornecido para demonstrar como configurar uma implementação JAX-RS alternativa. O add-on pode ser encontrado no diretório bmc-addons do SDK.

Para obter detalhes sobre instalação e configuração, consulte o arquivo Readme do add-on.

Para exemplos de código que demonstram como configurar o cliente, consulte:

Usando o SLF4J para Log

O registro em logs no SDK é feito por meio do SLF4J. O SLF4J é uma abstração de log que permite o uso de uma biblioteca de logs fornecida pelo usuário (por exemplo, log4j). Para obter mais informações, consulte o Manual do SLF4J.

Veja a seguir um exemplo que permite o log básico da saída padrão. Mais opções de log avançadas podem ser configuradas usando o binding do log4j.

  1. Faça download do jar de binding Simples do SLF4J Binding Simples do SLF4J
  2. Adicione o jar ao seu classpath (por exemplo, adicione-o ao diretório /third-party/lib do download do SDK)
  3. Adicione o seguinte argumento VM para ativar o log em nível de depuração (por padrão, o nível de informações é usado): -Dorg.slf4j.simpleLogger.defaultLogLevel=debug