开始之前
确保客户机有一个到 UserWorkArea 接口的引用(如主题“访问 UserWorkArea 分区”所述)或一个到用户定义分区的引用(如主题“访问用户定义工作区分区”中所定义)。以下步骤将 UserWorkArea 分区作为一个示例。但您完全可以用同样的方式来使用用户定义分区。
关于此任务
在使用工作区的业务应用程序中,服务器对象通常检索工作区属性并使用他们来指导本地工作。
过程
- 检索活动工作区的名称以确定调用线程是否与工作区关联。
应用程序使用 UserWorkArea 接口上的 getName 方法来检索当前工作区的名称。如果线程未与工作区关联,那么 getName 方法返回 null。在以下代码示例中,工作区的名称对应于工作区启动的类的名称。
public class SimpleSampleBeanImpl implements SessionBean {
...
public String [] test() {
// Get the work-area reference from JNDI.
...
// Retrieve the name of the work area. In this example,
// the name is used to identify the class in which the
// work area was begun.
String invoker = userWorkArea.getName();
...
}
}
- 覆盖工作区属性。 服务器对象可以通过创建自己的嵌套工作区来覆盖客户机工作区属性。请参阅“覆盖工作区属性”一文,以了解更多信息。
- 使用 get 方法从工作区检索属性。
get 方法特意设计为轻量级;没有声明的异常可供处理。如果没有活动的工作区或当前工作区中未设置这样的属性,那么 get 方法返回 null。
要点: 在以下罕见情况下,get 方法可能导致 NotSerializableError:CORBA 客户机设置了组合数据类型并调用企业 Bean 接口。
以下示例说明了 SimpleSampleBean 如何检索站点标识和优先级属性。注意,客户机将一个属性设置到外部工作区中,服务器端 Bean 将另一个属性设置到嵌套工作区中;嵌套对于属性检索是透明的。
public class SimpleSampleBeanImpl implements SessionBean {
public String [] test() {
...
// Begin a nested work area.
userWorkArea.begin("SimpleSampleBean");
try {
userWorkArea.set("company",
SimpleSampleCompany.London_Development);
}
catch (NotOriginator e) {
}
SimpleSampleCompany company =
(SimpleSampleCompany) userWorkArea.get("company");
SimpleSamplePriority priority =
(SimpleSamplePriority) userWorkArea.get("priority");
...
}
}
- 可选: 检索工作区中可见的所有键的列表。
UserWorkArea 接口为检索工作区中可见的所有键的列表提供了 retrieveAllKeys 方法。此方法不使用任何参数,返回一组字符串。如果线程没有任何关联的工作区,retrieveAllKeys
方法将返回 null。如果有一个不包含任何属性的关联工作区,此方法将返回一个大小为 0 的数组。
- 使用 getMode 方法查询工作区属性的方式
UserWorkArea 接口提供 getMode 方法,该方法用于确定特定属性的方式。此方法将属性的键作为一个参数并将方式作为一个 PropertyModeType 对象返回。如果工作区中没有指定的键,此方法将返回 PropertyModeType.normal,表示可以设置属性并正常移除。
- 可选: 删除工作区属性。
UserWorkArea 接口为从工作区的当前范围删除属性提供了 remove 方法。如果当前范围起初已设置此属性,那么移除此属性即可删除它。如果起初在封闭式工作区中已设置此属性,那么移除此属性将在完成当前范围之前删除它。完成当前工作区时,将复原删除的属性。
remove 方法将属性的键作为一个参数。只能移除方式为常规和只读的属性。试图移除固定属性将导致 PropertyFixed 异常。试图移除由其他进程发起的工作区中的属性将导致 NotOriginator 异常。
示例
SimpleSample 应用程序示例(包括在“开发使用工作区的应用程序”主题中)的服务器端接受来自客户机的远程调用。对于每个远程调用,如果客户机创建了工作区,服务器还会从客户机那里获得工作区。工作区是透明传播的。没有一种远程方法在其参数列表中包含工作区。
在示例应用程序中,服务器对象使用工作区接口只是出于演示目的。例如,SimpleSampleBean 故意尝试直接写到导入的工作区,这将导致 NotOriginator 异常。同样,Bean 故意尝试掩盖只读的 SimpleSampleCompany,这将导致 PropertyReadOnly 异常。SimpleSampleBean 还在调用 SimpleSampleBackendBean 之前对工作区进行嵌套并成功覆盖优先级属性。一个真正的业务应用程序将抽取出工作区属性并使用他们来指导本地工作。SimpleSampleBean 通过编写一条消息“从销售环境发出请求时功能被拒绝”来模拟这一操作。