Java 8 Runtime Environment

Com o App Engine, pode criar aplicações Web que usam a infraestrutura e os serviços escaláveis da Google. O App Engine executa a sua aplicação Web usando uma JVM Java 8. O App Engine invoca as classes de servlet da sua app para processar pedidos e preparar respostas neste ambiente.

A plataforma App Engine oferece muitos serviços de API incorporados que o seu código pode chamar. A sua aplicação também pode configurar tarefas agendadas que são executadas a intervalos especificados.

Especificar o tempo de execução do Java 8 para a sua app

Para fazer com que a sua app use o tempo de execução do Java 8, adicione a seguinte linha ao ficheiro appengine-web.xml:

<runtime>java8</runtime>

O ficheiro appengine-api.jar incluído na CLI do Google Cloud em platform/google_appengine/google/appengine/tools/java/lib/impl/appengine-api.jar representa a API App Engine para Java. Também pode aceder a este ficheiro através do repositório Maven que lista todas as versões.

Selecione a versão da API que a sua aplicação usa incluindo este JAR no diretório WEB-INF/lib/ da aplicação ou use o Maven para gerir as dependências. Se for lançada uma nova versão do ambiente de execução Java que introduza alterações que não sejam compatíveis com as apps existentes, esse ambiente terá um novo número de versão principal.

Usar o Maven para processar dependências

Pode usar o Maven para gerir todas as dependências. Por exemplo, esta entrada pom.xml inclui a API App Engine mais recente (Rappengine-api-1.0-sdk) disponível no Maven Central:

<dependency>
    <groupId>com.google.appengine</groupId>
    <artifactId>appengine-api-1.0-sdk</artifactId>
    <version></version>
</dependency>

A sandbox

O tempo de execução Java do App Engine distribui pedidos de aplicações por vários servidores Web e impede que uma aplicação interfira com outra. Uma app do App Engine não pode responder lentamente. Um pedido Web a uma aplicação tem de ser processado dentro do limite de tempo limite do pedido. Os processos que excedem este limite para responder são terminados para evitar sobrecarregar o servidor Web.

Tenha em atenção que o único local onde os utilizadores podem escrever ficheiros é o diretório /tmp. Os ficheiros em /tmp consomem a memória alocada à sua instância. Os ficheiros armazenados nesta localização só estão disponíveis para esta instância e apenas durante o ciclo de vida desta instância específica.

A forma habitual de a sua aplicação obter ficheiros de recursos é criar um pacote com os ficheiros dos quais depende com a sua aplicação em WEB-INF e, em seguida, carregá-los a partir da sua app usando Class.getResource(), ServletContext.getResource() ou métodos semelhantes. Por predefinição, todos os ficheiros no WAR são "ficheiros de recursos". Pode excluir ficheiros deste conjunto através do ficheiro appengine-web.xml.

Ordenação de JARs do carregador de classes

Por vezes, pode ser necessário redefinir a ordem em que os ficheiros JAR são analisados para classes de modo a resolver colisões entre nomes de classes. Nestes casos, a prioridade de carregamento pode ser concedida a ficheiros JAR específicos adicionando um elemento <class-loader-config> que contenha elementos <priority-specifier> no ficheiro appengine-web.xml. Por exemplo:

<class-loader-config>
  <priority-specifier filename="mailapi.jar"/>
</class-loader-config>

Isto coloca "mailapi.jar" como o primeiro ficheiro JAR a ser pesquisado para classes, exceto as que se encontram no diretório war/WEB-INF/classes/.

Se forem priorizados vários ficheiros JAR, é usada a respetiva ordem de carregamento original (relativamente uns aos outros). Por outras palavras, a ordem dos próprios elementos <priority-specifier> não é importante.

Discussões

Com o tempo de execução do Java 8, pode criar threads através da API ThreadManager do App Engine e das APIs incorporadas do Java, por exemplo, new Thread(). Atualmente, se quiser chamar APIs App Engine (com.google.appengine.api.*), tem de chamar essas APIs a partir de um segmento de pedido ou de um segmento criado através da API ThreadManager.

Uma aplicação pode

Se criar um ThreadPoolExecutor com currentRequestThreadFactory(), então shutdown() tem de ser chamado explicitamente antes de o pedido do servlet ser concluído. Se não o fizer, o pedido não é concluído e o servidor de apps acaba por falhar. Tenha em atenção que algumas bibliotecas podem criar ThreadPoolExecutors por si.

Uma aplicação pode realizar operações no thread atual, como thread.interrupt().

Cada pedido está limitado a 50 threads de pedidos da API App Engine simultâneos.

Quando usar threads, use objetos de simultaneidade de alto nível, como Executor e Runnable. Esses detalhes cuidam de muitos dos detalhes subtis, mas importantes, da concorrência, como interrupções e agendamento e contabilidade.

O número máximo de processos em segundo plano simultâneos criados pela API App Engine é de 10 por instância. (Este limite não se aplica a threads Java normais não relacionadas com a API App Engine.)

Ferramentas

IDEs suportados

As Cloud Tools for IntelliJ permitem-lhe executar e depurar aplicações do App Engine no IntelliJ IDEA. Pode implementar os seus projetos do App Engine em produção sem sair do IDE.

Ferramentas de compilação suportadas

Para acelerar o processo de desenvolvimento, pode usar os plug-ins do App Engine para o Apache Maven ou o Gradle:

Servidor de desenvolvimento local

O servidor de desenvolvimento executa a sua aplicação no computador local para desenvolvimento e testes. O servidor simula os serviços do Datastore. O servidor de desenvolvimento também pode gerar a configuração para os índices do Datastore com base nas consultas que a app executa durante os testes.

Simultaneidade e latência

A latência da sua aplicação tem o maior impacto no número de instâncias necessárias para publicar o seu tráfego. Se processar pedidos rapidamente, uma única instância pode processar muitos pedidos.

As instâncias de thread único podem processar um pedido simultâneo. Por conseguinte, existe uma relação direta entre a latência e o número de pedidos que podem ser processados na instância por segundo. Por exemplo, uma latência de 10 ms é igual a 100 pedidos/segundo/instância.

As instâncias com várias linhas de execução podem processar muitos pedidos simultâneos. Por conseguinte, existe uma relação direta entre a CPU consumida e o número de pedidos/segundo.

As apps Java suportam pedidos concorrentes, pelo que uma única instância pode processar novos pedidos enquanto aguarda que outros pedidos sejam concluídos. A simultaneidade reduz significativamente o número de instâncias de que a sua app precisa, mas tem de conceber a app para processamento multithread.

Por exemplo, se uma instância B4 (aproximadamente 2,4 GHz) consumir 10 Mcycles/pedido, pode processar 240 pedidos/segundo/instância. Se consumir 100 Mcycles/pedido, pode processar 24 pedidos/segundo/instância. Estes números são o caso ideal, mas são bastante realistas em termos do que pode realizar numa instância.

Lançamentos do App Engine Java

Todos os artefactos lançados que começam com a versão 2.x.x usam o mecanismo de lançamento de código aberto. Os artefactos lançados com a versão 1.9.9xx ou anterior usam o sistema de compilação interno. Consulte o repositório do GitHub para mais detalhes.

Variáveis de ambiente

As seguintes variáveis de ambiente são definidas pelo tempo de execução:

Variável de ambiente Descrição
GAE_APPLICATION O ID da sua aplicação do App Engine. Este ID tem o prefixo "region code~", como "e~" para aplicações implementadas na Europa.
GAE_DEPLOYMENT_ID O ID da implementação atual.
GAE_ENV O ambiente do App Engine. Definido como standard.
GAE_INSTANCE O ID da instância na qual o seu serviço está atualmente em execução.
GAE_RUNTIME O tempo de execução especificado no ficheiro app.yaml.
GAE_SERVICE O nome do serviço especificado no ficheiro app.yaml. Se não for especificado nenhum nome de serviço, este é definido como default.
GAE_VERSION A etiqueta da versão atual do seu serviço.
GOOGLE_CLOUD_PROJECT O Google Cloud ID do projeto associado à sua aplicação.
PORT A porta que recebe pedidos HTTP.

Pode definir variáveis de ambiente adicionais no seu ficheiro app.yaml, mas os valores acima não podem ser substituídos.