如何从Websphere的startWork任务中传递异常?

时间:2016-08-25 12:52:57

标签: java multithreading websphere runnable

我已经拥有了自己的类,使用以下run方法实现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());
  }
}

将此工作类传递给com.ibm.websphere.asynchbeans.WorkManager的startWork(Work var1)方法。

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

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

怎么做? Runnable不允许抛出已检查的异常。 RuntimeException没有帮助。似乎startWork将它吞入了内部。

这个第一种方法位于另一个项目模块中并且我无法从catch块到达它以传递信息来完成某项工作。这是不好的。

我也尝试在我的工作级中设置status然后得到它,但看起来像startWork不允许我改变传递的对象。

感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:3)

您需要使用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的原因。

答案 1 :(得分:1)

要获取已提交的asynchbeans Work的结果,您可以存储对com.ibm.websphere.asynchbeans.WorkItem的引用并调用getResult(),如果成功完成,它将返回您的工作结果,或者将抛出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
}