0

我正在使用 Ebay API 对商品进行投标。如果出现某种网络错误导致 API 调用不返回,我想在之后立即重试调用。看起来很简单,但我整天都在兜圈子。我对线程并没有真正的经验。这是它应该如何工作还是我完全错了?

这是可调用类:

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
4

1 回答 1

0

如果出现某种网络错误导致 API 调用不返回,我想在之后立即重试调用。

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

  1. 当你打电话给你时,future.cancel(true)你很可能不会停止当前的交易。除非您使用 NIO 调用,否则 IO 方法是不可中断的。中断线程只是在线程上设置一个标志,并导致那些抛出InterruptedException(如sleep, wait, join)的少数方法这样做。您必须观察Thread.currentThread().isInterrupted()方法才能看到中断。

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

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

于 2013-11-05T23:06:03.880 回答