Contexto de internacionalización: propagación y ámbito
El ámbito del contexto de internacionalización está implícito. Cada llamada de aplicación cliente Enterprise JavaBeans (EJB), método de servicio de servlet y método de empresa EJB tiene dos contextos de internacionalización bajo los que se ejecuta.
Para cada llamada de componente de aplicación, el contenedor entra el contexto de emisor de llamada y el contexto de llamada, según lo indica la política de internacionalización pertinente, en el ámbito antes de que el contenedor delegue en la implementación real. Cuando la implementación devuelve el control, el servicio elimina estos contextos del ámbito. El servicio de internacionalización no proporciona mecanismos de programación para componentes que gestionan explícitamente el ámbito del contexto de internacionalización.
El contexto de internacionalización cumple la semántica por valor a través de las solicitudes de método remoto. Los cambios en los elementos del contexto de internacionalización, cuyo ámbito es una llamada, no afectan a los elementos correspondientes del contexto de internacionalización, cuyo ámbito es el proceso remoto que realiza la llamada. Además, las modificaciones de los elementos de contexto que se obtienen utilizando la API del contexto de internacionalización no afectan a los elementos correspondientes cuyo ámbito es la invocación.
Programas cliente EJB (contenidos)
Antes de invocar el método main de un programa cliente de servicio web, el contenedor de cliente Java™ EE introduce en la invocación del ámbito y en la internacionalización del interlocutor contextos que contienen elementos nulos. Estos contextos permanecen en el ámbito en toda la duración del programa. Los programas de cliente EJB son la base de una cadena de invocaciones de métodos de empresa remotos y técnicamente no tienen un contexto de llamante lógico. El acceso a un elemento de contexto de llamante produce el correspondiente elemento predeterminado de la JVM de cliente. En solicitudes de métodos de empresa EJB, el servicio de internacionalización propaga el contexto de invocación al proceso de destino. Todos los elementos de contexto de invocación no establecidos (nulos) se sustituyen por el valor predeterminado de la JVM cuando se exportan por la API del contexto de internacionalización o por solicitudes salientes.
Para propagar valores distintos de los valores predeterminados de JVM a métodos de empresa remotos, los programas cliente EJB, así como los servlets de AMI o enterprise beans, deben establecer (alterar manualmente) elementos del contexto de invocación. Para obtener información sobre cómo establecer elementos de contexto de invocación, consulte Acceso a los entornos locales y a los husos horarios de invocación.
Servlets
En toda invocación del método de servicio de servlet (doGet, doPost), el contenedor web de Java EE inserta contextos de internacionalización de invocación e interlocutor en el ámbito antes de delegar en la implementación del método de servicio. El contexto del llamante contiene los idiomas aceptados que se han propagado a la solicitud del servlet HTTP, generalmente desde un navegador web. El contexto de invocación contiene el contexto indicado por el atributo de internacionalización de contenedor de la política de internacionalización asociada con el servlet. Todos los elementos de contexto de invocación no establecidos (nulos) se sustituyen por el valor predeterminado de la JVM del servidor cuando se exportan por la API del contexto de internacionalización o por solicitudes salientes. Los contextos de llamante e invocación permanecen en vigor hasta inmediatamente después de que la implementación devuelve el control, cuando el contenedor los elimina del ámbito.
Enterprise beans
En toda invocación de método de empresa de EJB, el contenedor Java EE EJB inserta los contextos de internacionalización de interlocutor e invocación en el ámbito antes de delegarlos en la implementación del método de empresa. El contexto de llamante contiene los elementos de contexto de internacionalización importados de la solicitud IIOP entrante; si la solicitud entrante carece de un elemento de contexto de internacionalización concreto, el contenedor asigna como ámbito un elemento nulo. El contexto de invocación contiene el contexto indicado por el atributo de internacionalización de contenedor de la política de internacionalización asociada con el método de empresa.
En solicitudes de métodos de empresa EJB, el servicio propaga el contexto de invocación al proceso de destino. Todos los elementos de contexto de invocación no establecidos (nulos) se sustituyen por el valor predeterminado de la JVM del servidor cuando se exportan por la API del contexto de internacionalización o por solicitudes salientes. Los contextos de llamante e invocación permanecen en vigor hasta inmediatamente después de que la implementación devuelve el control, cuando el contenedor los elimina del ámbito.
Tomemos una simple aplicación EJB con un cliente Java que llama al método de bean remoto miMétodoBean. En el cliente, la aplicación podría utilizar la API del servicio de internacionalización para establecer elementos de contexto de invocación. Cuando el cliente llama a miMétodoBean(), el servicio exporta el contexto de invocación del cliente a la solicitud saliente. En el servidor, el servicio separa el contexto importado de la solicitud entrante y lo asigna como ámbito al método como su contexto de llamante; también asigna el contexto de invocación como ámbito para el método, según indica la política de gestión de contexto de internacionalización asociada. A continuación, el contenedor de EJBllama a miMétodoBean, que puede utilizar la API de contexto de internacionalización para acceder a elementos de los contextos de invocación o de llamante. Cuando miMétodoBean devuelve el control, el contenedor de EJBelimina los contextos del ámbito.
Programas cliente de servicio web (contenidos)
Antes de invocar el método main de un programa cliente de servicio web, el contenedor de cliente introduce en el ámbito tanto el contexto de internacionalización de la invocación como el contexto del llamante que contienen elementos nulos. Estos contextos permanecen en el ámbito en toda la duración del programa. Los programas de cliente web son la base de una cadena de invocaciones de métodos de empresa remotos y técnicamente no tienen un contexto de llamante lógico. El acceso a un elemento de contexto de llamante produce el correspondiente elemento predeterminado de la máquina virtual del cliente.
En las solicitudes de servicio web de salida, el servicio de internacionalización crea de forma transparente un bloque de cabecera SOAP que contiene el contexto de invocación asociado con la hebra actual; la representación SOAP del contexto de invocación se propaga al proceso de destino a través de la solicitud. Todos los elementos de contexto de invocación no establecidos (es decir nulos) se sustituyen por el elemento predeterminado de la JVM cuando los exporta la API del contexto de internacionalización o las solicitudes de salida. Asimismo, dado que la cabecera solamente contiene un ID de huso horario, es posible que se pierda el estado adicional del objeto de huso horario del contexto de invocación (java.lang.SimpleTimeZone) debido a que no se propaga a través de la solicitud.
Para propagar valores distintos de los valores predeterminados de JVM a métodos de empresa remotos, los programas cliente web, así como los servlets de AMI o enterprise beans, deben establecer (alterar manualmente) elementos del contexto de invocación. Para obtener más información, consulte Acceso a los entornos locales y a los husos horarios de invocación.
Los beans de sesión sin estado están habilitados para servicios web
En toda invocación de método de empresa de un bean habilitado para servicio web, el contenedor de EJBinserta los contextos de internacionalización del llamante y de invocación en el ámbito antes de delegarlos a la implementación del método de empresa. El contexto de llamante contiene los elementos de contexto de internacionalización importados desde el bloque de la cabecera SOAP de la solicitud de entrada. Si la solicitud de entrada carece de un elemento de contexto de internacionalización concreto, el contenedor asigna como ámbito un elemento nulo. El contexto de invocación contiene el contexto indicado por el atributo de internacionalización de contenedor de la política de internacionalización asociada con el método de empresa.
En solicitudes de métodos de empresa EJB, el servicio propaga el contexto de invocación al proceso de destino. Todos los elementos de contexto de invocación no establecidos (es decir nulos) se sustituyen por el elemento predeterminado de la JVM del servidor cuando los exporta la API del contexto de internacionalización o las solicitudes de salida. Los contextos de llamante e invocación permanecen en vigor hasta inmediatamente después de que la implementación devuelve el control, cuando el contenedor los elimina del ámbito.
En las solicitudes de servicio web de salida, el servicio de internacionalización crea de forma transparente un bloque de cabecera SOAP que contiene el contexto de invocación asociado con la hebra actual. La representación SOAP del contexto de invocación se propaga mediante la solicitud al proceso de destino. Todos los elementos de contexto de invocación no establecidos (es decir nulos) se sustituyen por el elemento predeterminado de la JVM cuando los exporta la API del contexto de internacionalización o las solicitudes de salida.
Consideraciones de asociación de hebras
Los contenedores web y EJB asignan contextos de internacionalización el ámbito de un método, mediante su asociación con la hebra que ejecuta la implementación del método. De forma similar, los métodos del API del contexto de internacionalización pueden: asociar el contexto con la hebra en la que se ejecutan estos métodos, u obtener el contexto asociado a dicha hebra.
En los casos en los que las hebras se despliegan en el componente de aplicación (por ejemplo, una hebra generada por el usuario dentro del método service de un servlet, o un suceso generado por el sistema que gestiona la hebra en un cliente AWT), los contextos de internacionalización asociados a la hebra padre no se transfieren automáticamente a la nueva hebra que se despliega. En tales casos, el servicio exporta el entorno local y el huso horario predeterminado de la JVM de todas las solicitudes de método de empresa remotas y de todas las llamadas a la API ejecutadas en la nueva hebra.
Si el contexto predeterminado no es el apropiado, los elementos de contexto de invocación deseados deben asociarse explícitamente a la nueva hebra, utilizando los métodos setXxx de la interfaz InvocationInternationalization. Actualmente, las políticas de gestión de contextos de internacionalización permiten que el contexto de invocación se establezca en programas clientes EJB, así como en servlets, bean de sesión y beans controlados por mensajes que utilicen la internacionalización gestionada por aplicación.