我正在使用Ebay API对商品进行出价。如果存在某种网络错误以致API调用没有返回,我想立即重试该调用。看起来很简单,但我整天都在圈子里。我对线程技术并不熟悉。这是它应该如何工作还是我完全错了?
这是Callable类:
public class PlaceOfferThread implements Callable<Boolean> {
private PlaceOfferCall call;
public Boolean isComplete;
public PlaceOfferThread (PlaceOfferCall p) {
call = p;
}
@Override
public Boolean call() throws Exception {
try {
call.placeOffer();
return true;
}
catch (InterruptedException ex) {
ex.printStackTrace();
}
return false;
}
}
这是来电者
int timeout = 10;
int maxRetries = 5;
int retries = 0;
ExecutorService executor = Executors.newSingleThreadExecutor();
PlaceOfferThread thread = new PlaceOfferThread(call);
boolean flag = false;
while (!flag && retries++ < maxRetries) {
Future<Boolean> future = null;
try {
future = executor.submit(thread);
flag = future.get(timeout, TimeUnit.SECONDS);
future.cancel(true);
}
catch(TimeoutException ex) {
// no response from Ebay, potential network issues
// resubmit the call to Ebay with the same invocation id
future.cancel(true);
}
catch (Exception threadException) {
// any other exception indicates that we got a response from Ebay
// it just wasn't the response we wanted
throw new Exception(threadException.getMessage());
}
}
executor.shutdown(); // TODO
答案 0 :(得分:0)
如果存在某种网络错误以致API调用没有返回,我想立即重试该调用。
我不是100%确定你的应用程序现在如何工作,但这里有一些想法:
当您致电future.cancel(true)
时,您很可能不会停止当前的交易。除非您使用NIO调用,否则IO方法不可中断。中断线程只会在线程上设置一个标志,并导致抛出InterruptedException
(如sleep
,wait
,join
)的少数方法执行此操作。你必须看Thread.currentThread().isInterrupted()
方法才能看到中断。
我认为正确的做法是设置底层http-client对象的连接和IO超时,如果有问题,让它抛出或退出并出错。试图从另一个线程中杀死它会变得更加困难。
在查看代码时,我不确定为什么要使用线程。也许你正在进行其他处理,但最好直接拨打电话。然后,您可以调整HttpClient
的IO超时并适当地处理它们。