如何从 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();
...
}
那么,有两种选择:
- 您的
run
方法中的catch块可以将异常存储在实例字段中,然后您可以在调用getResult后检索它。
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
}
我有自己的 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();
...
}
那么,有两种选择:
- 您的
run
方法中的catch块可以将异常存储在实例字段中,然后您可以在调用getResult后检索它。 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
}