隐藏起来,使用户看不到。如果要使 JMS
队列在部署时对 J2EE 应用程序可用,您就要再
次使用特定于提供者的机制来创建受管 JMS 对象(队列连接工厂和目标)
,然后在 JNDI
名称空间内发布这些对象。提供者创建的受管对象包含与 JDBC 包装器(由容器提供的连
接池管理器添加)相似的自动征用代码。
透明的事务控制
两种类型的 J2EE
事务 ― 容器管理的和 bean
管理的 ― 在如何启动和结束事务
上是不同的。事务启动和结束的地方被称为 事务划分(transaction demarcation)
。清单 1 中的
示例代码演示了 bean 管理的事务(
有时也称为 编程(programmatic)事务)。Bean 管理的事务
是由组件使用 UserTransaction
类显式启动和结束的。通过 ejbContext
使 UserTransaction 对
EJB
组件可用,通过 JNDI
使其对其它 J2EE 组件可用。
容器根据组件的部署描述符中的事务属性代表应用程序透明地启动和结束容器
管理的事务(
或称为 宣告式事务(declarative transaction))
。通过将 transaction-type 属性设置
为 Container
或 Bean
您可以指出 EJB
组件是使用 bean 管理的事务性支持还是容器管理的
事务性支持。
使用容器管理的事务,您可以在 EJB 类或方法级别上指定事务性属性;您可以为
EJB 类指定缺省的事务性属性,如果不同的方法会有不同的事务性语义,您还可以为每
个方法指定属性。这些事务性属性在装配描述符(assembly descriptor)
的 container-transaction
部分被指定。清单 2
显示了一个装配描述符示例。 trans-attribute 的受支持的值有:
Supports
Required
RequiresNew
Mandatory
NotSupported
Never
trans-attribute 决定方法是否支持在事务内部执行、当在事务内部调用方法时容器
会执行什么操作以及在事务外部调用方法时容器会执行什么操作。最常用的容器管理的事
务属性是 Required
。如果设置了 Required
,过程中的事务将在该事务中征用您的 bean,
但如果没有正在运行的事务,容器将为您启动一个。在这个系列的第 3 部分,当您可能想
使用每个事务属性时,我们将研究各个事务属性之间的区别。
清单 2. EJB 装配描述符样本
1 <assembly-descriptor>