background image

 

等待资源适配器完成,或者被清理干净。相反,服务器可以通过调用 Work 

 

对象的 release 

 

方法,给资源适配器发信号。然后资源适配器应当尽快完成处理。清单 4 

 

显示了 release 方

法使用的一个示例:

 

  清单 4. Work 对象的示例
1 public class ExampleWork implements Work {
2     private volatile boolean _released;
3     void run() {
4         for (int i = 0; i < 100; i++) {
5             if (_released) break;
6             // Do something
7         }
8     }
9     void release() {
10         _released = true;
11     }
12     
13 }

 

  注意清单 4 

 

中使用的关键字 volatile

 

。在 run 方法正进行其处理的同时,会在一个独

 

立的线程上调用 release 方法,volatile 

 

修饰符确保 run 方法能够看到更新的字段。

  doWork 

 

方法也可能失败,抛出一个名称古怪的 WorkCompletedException 异常。这个

 

异常是在将 run 方法分配给一个线程时抛出的,但这个异常或者是上下文设置失败,或
者是通过抛出运行时异常退出方法。doWork 方法会提供一个错误代码,表示这些故障发
生的路径,还把问题原因作为链接的异常提供。

   

     为什么等待?

 

  您已经看到 doWork 方法允许您在调用线程阻塞的同时执行工作。但是如果您不想等

 —— 

也就是说,如果您不想同步执行工作,该怎么办呢 ?  

在 Java 2 平台标准版本

(J2SE)环境中,可以使用多线程实现这一目标。但是,J2EE 规范让应用程序服务器使用

 

Java 2 安全管理器防止应用程序离开自己的线程。如果应用服务器的这部分功能是通过

 

EJB 

 

池或 servlet 池来提供并发性,那么这样做是合理的。服务器也可能想把各种形式的上

下文都关联到一个线程上,因为产生新线程时,上下文可能会丢失。最后,正如我以前讨
论过的,不受服务器控制的线程会造成有序关机很难实现。

 

  虽然可以通过使用安全策略,逐个案例地克服这个限制,但是 WorkManager 上的 
startWork 

 

和 scheduleWork 方法可以让资源适配器异步地处理工作,同时确保应用程序服

务器仍然在控制之下。startWork 方法会一直等候,直到工作片断开始执行,但不用等到工
作结束。所以,如果调用器需要知道工作是否已经得以执行,但是不需要等到工作完成,
那么可以使用这种方法。相比之下,只要该工作调度被接受,scheduleWork 方法就立即返