Concurrency Utilities for Java EE

O Concurrency Utilities for Java™ EE é um modelo de programação assíncrono que permite enviar ou planejar tarefas para execução em paralelo, criar encadeamentos que herdam o contexto Java EE e transferir o contexto Java EE para a chamada de interfaces, como retornos de chamada assíncronos.

O Concurrency Utilities for Java EE pode melhorar o desempenho, ativando um programa Java EE para decompor operações em tarefas paralelas.

As tarefas podem ser executadas usando o contexto Java EE do componente Java EE de envio. Essas tarefas também podem ser executadas com cópias de outros contextos Java EE, como:
  • Contexto de Segurança
  • Contexto de Internacionalização
  • Contexto da área de trabalho

Interfaces de simultaneidade

O Concurrency Utilities for Java EE fornece quatro tipos principais de recursos, cada um dos quais pode ser configurado e disponibilizado na JNDI:

Serviço executor gerenciado
Os aplicativos usam um executor gerenciado para enviar tarefas assíncronas que podem começar a execução como encadeamentos, geralmente a partir de um conjunto, quando os recursos se tornam disponíveis para executá-las. As tarefas são instâncias de Callable ou Runnable. O aplicativo recebe um futuro, a partir do qual é possível verificar o status e obter ou esperar o resultado da conclusão da tarefa. O executor gerenciado inclui interfaces para enviar e esperar a conclusão de um grupo de tarefas ou de uma tarefa dentro de um grupo. As tarefas herdam o contexto do encadeamento que envia a tarefa.
Serviço do executor planejado gerenciado
Os aplicativos usam um executor planejado gerenciado para planejar tarefas assíncronas para iniciar a execução após um momento específico. As tarefas são instâncias de Callable ou Runnable. O executor planejado gerenciado inclui interfaces para replanejamento automático de uma tarefa, em um intervalo fixo ou calculado, de acordo com a lógica de negócios customizada. As tarefas herdam o contexto do encadeamento que planeja a tarefa.
Factory de encadeamento gerenciado
Os aplicativos usam um thread factory gerenciado para construir novos encadeamentos que herdam o contexto do componente de aplicativo que consultou ou injetou o thread factory gerenciado.
Serviço de contexto
Os aplicativos usam um serviço de contexto para construir proxies contextuais, o que permite que chamadas de uma ou mais interfaces de proxy herdem o contexto do encadeamento que criou o proxy.

Transações

Cada tarefa enviada ou planejada, thread factory gerenciado e operação de proxy contextual é chamada com qualquer transação que estava anteriormente no encadeamento suspenso, muito semelhante a transações gerenciadas por contêiner em enterprise beans típicos. É semelhante à situação em que um método Enterprise JavaBeans (EJB) é chamado com TX_NOT_SUPPORTED. O tempo de execução inicia uma restrição de transação local antes de chamar o método. A tarefa pode iniciar sua própria transação global, se essa transação for possível para o componente Java EE de chamada. É possível substituir esse comportamento para proxies contextuais, especificando a propriedade de execução TRANSACTION com um valor de USE_TRANSACTION_OF_EXECUTION_THREAD. A propriedade permite que a transação permaneça no encadeamento de execução para que as operações transacionais executadas no método de proxy possam confirmar e retroceder junto com a transação do encadeamento de chamada.

Ao chamar um bean de entidade a partir de uma tarefa, por exemplo, é preciso ter um contexto transacional global disponível no encadeamento atual. Como as tarefas iniciam contextos transacionais locais, é possível englobar toda a lógica de bean de entidade em um bean de sessão que tenha um método marcado como X_REQUIRES ou equivalente. Esse processo estabelece um contexto transacional global a partir do qual você pode acessar um ou mais métodos de beans de entidade.

Acesso aos Metadados do Componente do Java EE

Se uma tarefa for um componente Java EE, como um bean de sessão, seus próprios metadados estarão ativos quando um método for chamado. Se uma tarefa for um objeto Java simples, os metadados do componente Java EE do componente de criação estarão disponíveis para o bean. Como seu encadeamento de envio, a tarefa pode consultar os namespaces java:comp, java:module e java:app. Essa consulta permite que o bean acesse recursos, como origens de dados, connection factories e enterprise beans, assim como acessaria se fosse qualquer outro componente Java EE. As propriedades de ambiente do componente de criação também estão disponíveis para a tarefa.

O espaço de nomes java:comp é idêntico ao disponível para o componente de criação; as mesmas restrições se aplicam. Por exemplo, se o enterprise bean ou o servlet tiver uma referência EJB de java:comp/env/ejb/MyEJB, essa referência EJB estará disponível para a tarefa.

Gerenciamento de conexões

Uma tarefa pode usar as origens de dados e connection factories que seu componente Java EE de criação obteve usando referências de recursos java:comp. (Para obter informações adicionais sobre referências de recursos, consulte o tópico Referências.) No entanto, o método do bean deve acessar essas conexões usando um padrão get, use ou close. Não há nenhum armazenamento em cache de conexão entre chamadas de métodos em uma tarefa assíncrona. As connection factories ou as origens de dados podem ser armazenadas em cache, mas as conexões devem ser recuperadas em todas as chamadas de método, utilizadas e, em seguida, fechadas. Embora o método de tarefa possa consultar connection factories e origens de dados usando um nome Java Naming and Directory Interface (JNDI) global, isso não é recomendado pelas seguintes razões:

  • O nome JNDI é codificado permanentemente no aplicativo (por exemplo, como uma propriedade ou sequência literal).
  • As connection factories não são compartilhadas, porque não há como especificar um escopo de compartilhamento.

Para obter exemplos de código que demonstrem as maneiras corretas e incorretas de acessar conexões a partir de tarefas, consulte o tópico Exemplo: Gerenciamento de conexão de simultaneidade.

Início adiado de tarefas contextuais

O Concurrency Utilities for Java EE suporta início adiado, permitindo a serialização de informações de contexto de encadeamento Java EE. Os proxies conceituais serão serializáveis se a instância fornecida para o método ContextService.createContextualProxy for serializável. Neste ponto, o serviço de contexto cria uma captura instantânea dos contextos Java EE ativados no WorkManager. O proxy contextual resultante pode então ser serializado e armazenado em um banco de dados ou arquivo. Isso é útil quando for necessário armazenar contextos do serviço do Java EE, como a identidade de segurança atual ou código de idioma, e, posteriormente, preenchê-los e executar alguma tarefa dentro deste contexto. Todos os métodos de interface do proxy contextual são executados com o contexto de encadeamento capturado anteriormente.

Todos os proxies contextuais devem ser desserializados pelo mesmo aplicativo que os serializou. Todos os EJBs e classes devem estar presentes para que o Java preencha com sucesso os objetos contidos neles.

Início Adiado e Segurança

O contexto de serviço de segurança pode requerer a asserção de identidade Common Secure Interoperability Versão 2 (CSIv2) para ser ativado. A asserção de identidade é necessária quando o proxy contextual é desserializado e executado na designação de credencial de identidade do assunto Java Authentication and Authorization Service (JAAS). Revise os seguintes tópicos para melhor entender se é preciso ativar a asserção de identidade ao usar um proxy contextual:

  • Configurando o tópico Common Secure Interoperability Versão 2 e Security Authentication Service
  • Asserção de Identidade

Há também limitações com a interoperação com proxies contextuais em versões diferentes do produto.

Limitações Relacionadas ao JPA

O uso de tarefas assíncronas em um contexto de persistência estendido de JPA não é suportado.

Um contexto de persistência estendido de JPA é inconsistente com os recursos de planejamento e multiencadeamento do Concurrency Utilities for Java EE e não estará acessível a partir de uma tarefa assíncrona.

Da mesma forma, uma tarefa assíncrona não deve usar um javax.persistence.EntityManager (ou subclasse) como um parâmetro, porque as instâncias EntityManager não são destinadas a serem thread-safe.


Ícone que indica o tipo de tópico Tópico de Conceito



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=casb_concurrency
Nome do arquivo: casb_concurrency.html