background image

5             WorkListener workListener) throws WorkException;
6     long startWork(Work work) throws WorkException;
7     long startWork(Work work, long startTimeout, ExecutionContext execContext,
8             WorkListener workListener) throws WorkException;
9     void scheduleWork(Work work) throws WorkException;
10     void scheduleWork(Work work, long startTimeout,
11             ExecutionContext execContext, WorkListener workListener)
12             throws WorkException;
13     
14 }

 

  每个方法接收的第一个参数,都是实现 Work 

 

接口的对象的一个实例,如清单 3 所

示:

 

 

 清单 3. 

 

资源适配器实现的 Work 接口

1 public interface Work extends Runnable {
2     void release();
3     
4 }

  Work 

 

接口扩展了 Runnable 

 

接口,您应当像直接进行 Java 线程编程时所做的那样,

实现 run 

 

方法中执行的工作。您很快就会看到 release 方法发挥其作用的地方。

  WorkManager 

 

上的 doWork 方法可以让一些工作同步执行、一直受阻塞或者直到某些

——

 

工作完成才执行。这看起来可能不是特别有用

这不就是直接调用 run 方法时发生的事

情吗?并不完全如此。首先,它让应用程序服务器说明现在不是做这项工作的恰当时候。例

 

如,如果在 ResourceAdapter start 

 

方法的范围内调用 doWork,那么您可能发现它将抛出 

WorkRejectedException 异常。应当尽快从这个方法返回,如果可能的话,应当把工作安排
成异步处理。

 

  第二,如果应用服务器特别繁忙,那么它可能会推迟这项工作的启动。可以用第 2 个
startTimeout 参数指明资源适配器准备为工作启动等候多长时间。如果应用服务器没能在

 

这个时间内启动工作,那么就会抛出 WorkRejectedException 异常。WorkManager 接口定义

 

了常量 IMMEDIATE   

和 INDEFINITE,它们允许资源适配器指明自己根本不准备等候或

者准备一直等候下去。

  第三,正如下一节解释的,有可能让工作片断在资源适配器导入的事务上下文中执

 

行,而不是在与当前线程关联的上下文中执行。这正是第 3 个参数的用途,该参数是一个

 

可选的 ExecutionContext。

 

  最后,使用 doWork 方法让应用服务器对资源适配器执行的工作拥有更多控制。在关
闭应用服务器时,如果资源适配器夹在一个漫长的、复杂的操作中间,那么服务器不需要