国际化上下文:传播和范围
国际化上下文的范围是隐式的。 每个 Enterprise JavaBeans (EJB) 客户机应用程序、Servlet 服务方法和 EJB 业务方法调用都具有两个可在其下运行的国际化上下文。
对于每次应用程序组件调用,容器在委派给实际实现前,会将调用者上下文和调用上下文按照相关国际化策略所指示方式输入范围。当实现返回时,服务从范围移除这些上下文。 国际化服务为组件提供非程序化机制以显式管理国际化上下文范围。
国际化上下文在远程方法请求上按值查看语义。设定调用范围的国际化上下文元素的更改不影响范围设定为远程调用过程的国际化上下文的相应元素。而且,使用国际化上下文 API 获取的上下文元素修改不影响设定调用范围的相应元素。
EJB 客户机程序(已包含)
在调用客户机程序的 main 方法前,Java™ EE 客户机容器将包含 null 元素的一些调用和调用者国际化上下文引入作用域。在整个程序生命期内,这些上下文保持在范围内。EJB 客户机程序是远程业务方法调用链中的基础,而且从技术上来说,没有逻辑调用者上下文。访问调用者上下文元素产生客户机 JVM 的相应缺省元素。对出局 EJB 业务方法请求,国际化服务将调用上下文传播给目标进程。当由国际化上下文 API 或出局请求导出时,使用 JVM 缺省值替换任何未设置的 (null) 调用上下文元素。
要将除 JVM 缺省值之外的值传播给远程业务方法,EJB 客户机程序,以及 AMI servlet 或企业 Bean 必须设置(覆盖)调用上下文的元素。要了解如何设置调用上下文元素,请参阅访问调用语言环境和时区。
Servlet
在每次执行 servlet 服务方法(doGet 或 doPost)调用时,Java EE Web 容器在委派给服务方法实现前,将调用者和调用国际化上下文引入作用域。调用者上下文包含用 HTTP servlet 请求传播的接受语言,该请求通常来自 Web 浏览器。调用上下文包含与 servlet 关联的国际化策略的容器国际化属性表明的上下文。当由国际化上下文 API 或出局请求导出时,使用服务器 JVM 缺省值替换任何复位 (null) 调用上下文元素。调用者和调用上下文一直保持有效,直到实现返回后,此时容器才会从范围移除它们。
企业 Bean
在每次执行 EJB 业务方法调用时,Java EE EJB 容器在委派给业务方法实现前,将调用者和调用国际化上下文引入作用域。调用者上下文包含从入局 IIOP 请求导入的国际化上下文元素;如果入局请求缺乏特定国际化上下文元素,容器范围设定为 null 元素。调用上下文包含与业务方法关联的国际化策略的容器国际化属性表明的上下文。
对出局 EJB 业务方法请求,服务将调用上下文传播给目标进程。当由国际化上下文 API 或出局请求导出时,使用服务器 JVM 缺省值替换任何复位 (null) 调用上下文元素。调用者和调用上下文一直保持有效,直到实现返回后,此时容器才会从范围移除它们。
假定 Java 客户机的简单 EJB 应用程序调用远程 myBeanMethod Bean 方法。在客户机端,应用程序可使用国际化服务 API 设置调用上下文元素。当客户机调用 myBeanMethod() 时,服务将客户机调用上下文导出到出局请求。在服务器端,服务将导入的上下文从入局请求拆离,并将它的范围设定为其调用者上下文的方法;服务还将调用上下文的范围设定为关联国际化上下文管理策略表明的方法。EJB 容器则可调用 myBeanMethod 方法,这可以使用国际化上下文 API 访问调用者或调用上下文的元素。当 myBeanMethod 方法返回时,EJB 容器从范围移除这些上下文。
Web Service 客户机程序(已包含)
在调用 Web Service 客户机程序的 main 方法前,客户机容器将调用和包含 null 元素的一些调用者国际化上下文引入范围。在整个程序持续时间内,这些上下文保持在范围内。Web Service 客户机程序是远程业务方法调用链中的基础,而且从技术上来说,没有逻辑调用者上下文。访问调用者上下文元素产生客户机虚拟机的相应缺省元素。
收到出局 Web Service 请求时,国际化服务将以透明的方式创建一个包含与当前线程相关联的调用上下文的 SOAP 头块;调用上下文的 SOAP 表示是通过此请求传播至目标进程的。当由国际化上下文 API 或出局请求导出时,使用 JVM 缺省元素替换任何复位(即 null)调用上下文元素。而且,因为头仅包含时区标识,则调用上下文的时区对象 (java.lang.SimpleTimeZone) 的其他状态可能丢失,这是因为它未通过请求进行传播。
要将除 JVM 缺省值之外的值传播给远程业务方法,Web Service 客户机程序,以及 AMI servlet 或企业 Bean 必须设置(覆盖)调用上下文的元素。有关更多信息,请参阅访问调用语言环境和时区。
为 Web Service 启用的无状态会话 Bean
在每次执行支持 Web Service 的 Bean 的方法调用时,EJB 容器在将控制委派给业务方法实现前,将调用者和调用国际化上下文引入范围。调用者上下文包含从入局请求的 SOAP 头块导入的国际化上下文元素。如果入局请求缺乏特定国际化上下文元素,那么容器将 null 元素引入范围。调用上下文包含与业务方法关联的国际化策略的容器国际化属性表明的上下文。
对出局 EJB 业务方法请求,服务将调用上下文传播给目标进程。当由国际化上下文 API 或出局请求导出时,使用服务器 JVM 的缺省元素替换任何复位(即 null)调用上下文元素。调用者和调用上下文一直保持有效,直到控制从业务方法实现立即返回后,此时容器从范围移除它们。
对出局 Web Service 请求,国际化服务透明地创建 SOAP 头块,该头块包含与当前线程关联的调用上下文。通过请求将调用上下文的 SOAP 说明传播给目标进程。当由国际化上下文 API 或出局请求导出时,使用 JVM 缺省元素替换任何复位(即 null)调用上下文元素。
线程关联注意事项
通过将方法与运行方法实现的线程相关联,Web 和 EJB 容器将国际化上下文的范围设定为方法。同样,国际化上下文 API 的方法将上下文与运行这些方法的线程相关联,或者获取与运行这些方法的线程相关联的上下文。
在应用程序组件中衍生新线程的情况下(例如,servlet 的 service 方法内用户生成的线程,或 AWT 客户机中系统生成的事件处理线程),与父线程关联的国际化上下文不会自动传送给最新衍生的线程。在这种实例中,服务导出任何远程业务方法请求,以及在新线程上运行的任何 API 调用的 JVM 的缺省语言环境和时区。
如果缺省上下文不合适,那么需要的调用上下文元素必须使用 InvocationInternationalization 接口的 setXxx 方法与新线程明确关联。当前,国际化上下文管理策略允许在 EJB 客户机程序,以及 servlet、会话 Bean 和使用应用程序管理的上下文的消息驱动的 Bean 内设置调用上下文。