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