Contexto de Internacionalização: Propagação e Escopo
O escopo do contexto de internacionalização é implícito. Cada chamada de aplicativo cliente JavaBeans (EJB), de método de serviço de servlet e de método de negócios EJB tem dois contextos de internacionalização sob os quais ela é executada.
Para cada chamada do componente de aplicativo, o contêiner insere o contexto de responsável pela chamada e o contexto de chamada, conforme indicado pela política de internacionalização pertinente, no escopo antes do contêiner delegar para a implementação real. Quando a implementação retorna, o serviço remove esses contextos do escopo. O serviço de internacionalização não fornece mecanismo programático de componentes para gerenciar explicitamente o escopo do contexto de internacionalização.
O contexto de internacionalização observa a semântica por valor sobre pedidos de métodos remotos. As mudanças nos elementos do contexto de internacionalização com escopo definido para uma chamada não afetam os elementos correspondentes do contexto de internacionalização com escopo definido para o processo de chamada remoto. Além disso, as modificações nos elementos de contexto obtidas utilizando a API do contexto de internacionalização não afetam os elementos correspondentes com escopo definido para a chamada.
Programas Clientes EJB (Contidos)
Antes de chamar o método main de um programa cliente, o contêiner do cliente Java™ EE introduz no escopo alguns contextos de internacionalização do responsável pela chamada e da chamada que contêm elementos nulos. Esses contextos permanecem no escopo durante toda a existência do programa. Os programas clientes EJB são a base em uma cadeia de chamadas remotas do método de negócios e, tecnicamente, não possuem um contexto lógico de responsável pela chamada. O acesso a um elemento do contexto de responsável pela chamada origina o elemento padrão correspondente da JVM do cliente. Em pedidos de saída do método de negócios EJB, o serviço de internacionalização propaga o contexto de chamada para o processo de destino. Quaisquer elementos do contexto de chamada não definidos (nulos) são substituídos pelo padrão da JVM quando exportados pela API do contexto de internacionalização ou por pedidos de saída.
Para propagar valores diferentes dos padrões da JVM para métodos de negócios remotos, os programas clientes EJB, bem como os servlets ou enterprise beans AMI, devem definir (substituir) elementos do contexto de chamada. Para aprender como configurar elementos do contexto de chamada, consulte Acessando Códigos do Idioma e Fusos Horários de Chamada.
Servlets
Em cada chamada de método (doGet ou doPost) de serviço do servlet, o contêiner de Web do Java EE introduz os contextos de internacionalização de responsável pela chamada e de chamada no escopo, antes de delegar para a implementação do método de serviço. O contexto de responsável pela chamada contém os accept-languages propagados no pedido de servlet HTTP, geralmente a partir de um navegador da Web. O contexto de chamada contém qualquer contexto indicado pelo atributo de internacionalização do contêiner da política de internacionalização associada ao servlet. Quaisquer elementos do contexto de chamada não definidos (nulos) são substituídos pelo padrão da JVM do servidor quando exportados pela API do contexto de internacionalização ou por pedidos de saída. Os contextos de responsável pela chamada e de chamada permanecem efetivos até que a implementação retorne, em cujo momento o contêiner os remove do escopo.
Beans Corporativos
Em cada chamada de método de negócios do EJB, o contêiner de EJB do Java EE introduz os contextos de internacionalização de responsável pela chamada e de chamada no escopo, antes de delegar para a implementação do método de negócios. O contexto de responsável pela chamada contém os elementos do contexto de internacionalização importados do pedido de entrada IIOP; se o pedido de entrada omitir um elemento específico do contexto de internacionalização, o contêiner abrangerá um elemento nulo. O contexto de chamada contém qualquer contexto que seja indicado pelo atributo de internacionalização de contêiner do critério de internacionalização associado ao método de negócios.
Em pedidos de saída do método de negócios EJB, o serviço propaga o contexto de chamada para o processo de destino. Quaisquer elementos do contexto de chamada não definidos (nulos) são substituídos pelo padrão da JVM do servidor quando exportados pela API do contexto de internacionalização ou por pedidos de saída. Os contextos do responsável pela chamada e de chamada permanecem efetivos, até imediatamente após o retorno da implementação, quando o contêiner remove-os do escopo.
Considere um aplicativo EJB simples com um cliente Java que chama o método do bean myBeanMethod remoto. No lado cliente, o aplicativo pode usar a API do Serviço de Internacionalização para definir elementos de contexto de chamada. Quando o cliente chama o myBeanMethod(), o serviço exporta o contexto de chamada do cliente para o pedido que sai. No lado do servidor, o serviço desanexa o contexto importado do pedido que chega e define seu escopo para o método como seu contexto do responsável pela chamada; o serviço também define o escopo do contexto de chamada para o método, conforme indicado pela política de gerenciamento de contexto de internacionalização associada. O contêiner EJB então chama o método myBeanMethod, que pode usar a API do contexto de internacionalização para acessar elementos dos contextos do responsável pela chamada ou de chamada. Quando o método myBeanMethod é retornado, o contêiner EJB remove estes contextos do escopo.
Programas Clientes de Serviços da Web (Contidos)
Antes de chamar o método main de um programa cliente de serviço da Web, o contêiner do cliente introduz no escopo os contextos de internacionalização do responsável pela chamada e da chamada que contêm elementos nulos. Estes contextos permanecem no escopo durante toda a existência do programa. Os programas clientes de serviços da Web são a base em uma cadeia de chamadas remotas do método de negócios e, tecnicamente, não possuem um contexto lógico de responsável pela chamada. O acesso a um elemento do contexto de responsável pela chamada origina o elemento padrão correspondente da máquina virtual do cliente.
Nas solicitações do serviço da web de saída, o serviço de internacionalização cria de forma transparente um bloco de cabeçalho SOAP que contém o contexto de chamada associado ao encadeamento atual; a representação SOAP do contexto de chamada é propagada por meio da solicitação para o processo de destino. Quaisquer elementos do contexto de chamada não definidos (ou seja, nulos) são substituídos pelo elemento padrão da JVM quando exportados pela API do contexto de internacionalização ou por pedidos de saída. Além disso, como o cabeçalho contém apenas um ID de fuso horário, o estado adicional do objeto de fuso horário (java.lang.SimpleTimeZone) do contexto de chamada pode ser perdido, porque ele não é propagado por meio do pedido.
Para propagar valores diferentes dos padrões da JVM para métodos de negócios remotos, os programas clientes de serviços da Web, bem como os servlets ou enterprise beans AMI, devem definir (substituir) elementos do contexto de chamada. Para obter informações adicionais, consulte Acessando Códigos do Idioma e Fusos Horários de Chamada.
Beans de Sessão sem Estado Que Estão Ativados para Serviços da Web
Em cada chamada de método de um bean ativado para serviços da Web, o contêiner de EJB introduz os contextos de internacionalização de responsável pela chamada e de chamada no escopo, antes de delegar o controle para a implementação do método de negócios. O contexto de responsável pela chamada contém os elementos de contexto de internacionalização importados do bloco de cabeçalho SOAP do pedido que chega. Se o pedido de entrada omitir um elemento específico do contexto de internacionalização, o contêiner introduzirá um elemento nulo no escopo. O contexto de chamada contém qualquer contexto que seja indicado pelo atributo de internacionalização de contêiner do critério de internacionalização associado ao método de negócios.
Em pedidos de saída do método de negócios EJB, o serviço propaga o contexto de chamada para o processo de destino. Quaisquer elementos do contexto de chamada não definidos (ou seja, nulos) são substituídos pelo elemento padrão da JVM do servidor quando exportados pela API do contexto de internacionalização ou por pedidos de saída. Os contextos de responsável pela chamada e de chamada permanecem efetivos até que o controle retorne da implementação do método de negócios, em cujo momento o contêiner os remove do escopo.
Nas solicitações de serviço da web de saída, o serviço de internacionalização cria de forma transparente um bloco de cabeçalho SOAP que contém o contexto de chamada associado ao encadeamento atual. A representação SOAP do contexto de chamada é propagada por meio do pedido para o processo de destino. Quaisquer elementos do contexto de chamada não definidos (ou seja, nulos) são substituídos pelo elemento padrão da JVM quando exportados pela API do contexto de internacionalização ou por pedidos de saída.
Considerações sobre Associação de Encadeamentos
Os contêineres da Web e EJB definem o escopo de contextos de internacionalização para um método, associando o método ao encadeamento que executa a implementação do método. De modo semelhante, os métodos da API do contexto de internacionalização associam contexto com ou obtêm contexto associado ao encadeamento no qual esses métodos são executados.
Nos casos em que novos encadeamentos são gerados em um componente de aplicativo (por exemplo, um encadeamento gerado pelo usuário no método service de um servlet ou um encadeamento de tratamento de eventos gerados pelo sistema em um cliente AWT), os contextos de internacionalização associados ao encadeamento pai não são transferidos automaticamente para o encadeamento recém-gerado. Nesses casos, o serviço exporta o código do idioma e o fuso horário padrão da JVM em qualquer pedido remoto do método de negócios e em quaisquer chamadas da API executadas no novo encadeamento.
Se o contexto padrão não for apropriado, os elementos do contexto de chamada desejados deverão ser explicitamente associados ao novo encadeamento, utilizando os métodos setXxx da interface InvocationInternationalization. No momento, as políticas de gerenciamento de contexto de internacionalização permitem que o contexto de chamada seja definido em programas clientes EJB, e também em servlets, em beans de sessão e em beans orientados a mensagens que utilizam a internacionalização gerenciada por aplicativo.