如何从 Websphere 开始工作任务进一步传递异常?

How to pass exception futher from Websphere's startWork task?

我有自己的 class,它使用以下 运行 方法实现 com.ibm.websphere.asynchbeans.Work

@Override
public void run() {
  try {
    agentManager.loadLibContent(agent);
  } catch (Exception e) {
    ErrorAnalizer.report(e);
    log.error("some err: "+e.getMessage());
    //this.setStatus("error");
    //throw new RuntimeException(e);
  } finally {
    workLoadManager.delRunTask(getTaskHistory());
  }
}

这项工作-class 被传递给 com.ibm.websphere.asynchbeans.WorkManager 的 startWork(Work var1) 方法。

当我在 try 块中遇到异常时,它会被捕获并记录下来,没问题。

但是我希望该异常向上移动,直到它到达调用 websphere 的 startWork 的第一个方法。

怎么做? Runnable 不允许抛出检查异常。 RuntimeException 没有帮助。 startWork 似乎在内部某处吞下了它。

糟糕的是,第一个方法位于另一个项目模块中,我无法从 catch 块访问它以传递信息来完成某些工作。

我也尝试在我的工作中设置状态-class 然后在之后获取它,但看起来 startWork 不让我更改传递的对象。

感谢任何帮助。谢谢!

您需要使用WorkItem.getResult方法:

MyWork myWork = ...
WorkItem wi = wm.startWork(myWork);
...
try {
    myWork = (MyWork)wi.getResult();
    ...
} catch (WorkException e) {
    Throwable cause = e.getCause();
    ...
}

那么,有两种选择:

  1. 您的run方法中的catch块可以将异常存储在实例字段中,然后您可以在调用getResult后检索它。
  2. run 方法抛出一个未经检查的异常,它应该是被捕获的 WorkException 的原因。

要获得提交的异步 beans Work 的结果,您可以存储对 com.ibm.websphere.asynchbeans.WorkItem 的引用并调用 getResult() 这将 return 您的工作结果,如果它成功完成,否则它将抛出一个 com.ibm.websphere.asynchbeans.WorkException 来包装 Work 实现抛出的异常。

这是一个例子:

// Submit the work
WorkItem workItem = workManager.startWork(new MyWork());

// Wait for the work to be done for up to 60s
ArrayList<WorkItem> items = new ArrayList<WorkItem>();
boolean workFinished = workManager.join(items, WorkManager.JOIN_AND, 60*1000);

if(workFinished)
  try {
    MyWork work = workItem.getResult();
    // if we get here, the work completed without errors
  } catch(WorkException e) {
    throw e.getCause(); // this will be the exception thrown by your Work impl
  } 
else {
  // the Work did not finish in 60s
}