执行Runnable,Timeout,然后重试

时间:2013-11-05 22:56:41

标签: java multithreading timeout

我正在使用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

1 个答案:

答案 0 :(得分:0)

  

如果存在某种网络错误以致API调用没有返回,我想立即重试该调用。

我不是100%确定你的应用程序现在如何工作,但这里有一些想法:

  1. 当您致电future.cancel(true)时,您很可能不会停止当前的交易。除非您使用NIO调用,否则IO方法不可中断。中断线程只会在线程上设置一个标志,并导致抛出InterruptedException(如sleepwaitjoin)的少数方法执行此操作。你必须看Thread.currentThread().isInterrupted()方法才能看到中断。

  2. 我认为正确的做法是设置底层http-client对象的连接和IO超时,如果有问题,让它抛出或退出并出错。试图从另一个线程中杀死它会变得更加困难。

  3. 在查看代码时,我不确定为什么要使用线程。也许你正在进行其他处理,但最好直接拨打电话。然后,您可以调整HttpClient的IO超时并适当地处理它们。