我已经拥有了自己的类,使用以下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不允许我改变传递的对象。
感谢任何帮助。谢谢!
答案 0 :(得分:3)
您需要使用WorkItem.getResult方法:
MyWork myWork = ...
WorkItem wi = wm.startWork(myWork);
...
try {
myWork = (MyWork)wi.getResult();
...
} catch (WorkException e) {
Throwable cause = e.getCause();
...
}
然后,有两个选项:
run
方法中的catch块可以将异常存储在实例字段中,然后您可以在调用getResult后检索它。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
}