我已经创建了以下FutureTask方法来异步运行方法。
public FutureTask<Object> SendAggregateEventAsync(final
com.Company.Product.SDK.Device.AggregateEvent.ClassObject
request)
{
FutureTask<Object> futureTask;
futureTask = new FutureTask<Object>(new Runnable() {
public void run()
{
try {
SendAggregateEvent(request);
} catch (ResponseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, null);
return futureTask;
}
public void SendAggregateEvent(
com.Company.Product.SDK.Device.AggregateEvent.ClassObject
request) throws ResponseException
{
try
{
if(request == null) throw new IllegalArgumentException("request");
String[] s_array = new String[0];
s_array[0] = "EventTime";
String namespace = "http://Product.Company.com/" +
"v1.0/Device/AggregateEvent";
IBindingFactory factory;
factory = BindingDirectory.getFactory(
com.Compant.Product.SDK.Device.AggregateEvent.
ClassObject.class);
String message = ChangeDatesToUTC(MessageHelper.
SerializeObject(factory, request), s_array, namespace);
SendMessage(message);
} catch (JiBXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}为了编译,我必须捕获FutureTask中的ResponseException,但关键是要将此ResponseException抛给实现应用程序,而不是被FutureTask捕获。有没有办法在FutureTask中抛出这个异常?
发布于 2013-06-04 04:31:50
将Pass a Callable传递给构造函数,而不是传递一个Runnable,这样您就不必再捕获异常:
futureTask = new FutureTask<Object>(new Callable() {
public Object call() throws ResponseException {
SendAggregateEvent(request);
return null;
}
};(但是FutureTask的泛型类型应该是Void而不是Object)。
如果call()抛出ResponseException,则FutureTask的get()方法将抛出ExecutionException,导致此异常的原因是ResponseException。
也就是说,您不应该简单地将Callable提交给ExecutorService,然后让它为您创建一个未来吗?还要尝试遵守Java命名约定,并从方法中删除throws子句,因为它不会抛出任何异常。命名也很糟糕:您的方法不发送任何内容。它只创建一个FutureTask,当执行时,它将发送一个事件。
https://stackoverflow.com/questions/16905277
复制相似问题