有没有办法在Java中使用线程的任务队列进行退避重试?

时间:2016-02-23 19:20:00

标签: java android multithreading

如何正确地执行工具"指数退避"在java服务器上?

我有这段代码:

ParallelStream调用此方法(多线程):

private void concurrentlyUpdateCachedLine(String lineName, ConcurrentLineUpdate lineUpdate) {
try {
for (long delayMs = 1; ; delayMs = Math.max(delayMs *2, 100)) {
final IdentifiableValue retrievedIdentifiable = retrieveIdentifiable(lineName);
Line retrievedLine = (Line) retrievedIdentifiable.getValue();

if (retrievedLine == null) {
create(lineName);
continue;
}

lineUpdate.doUpdate(retrievedLine);

if (memCache.putIfUntouched(lineName, retrievedIdentifiable, retrievedLine)) {
break;
}
Thread.sleep(delayMs);
}
} catch (InterruptedException e) {
System.out.println("Error when caching line");
e.printStackTrace();
}
}

当我在android或ios上写一个指数退避时,

我用线程'队列

    if shouldRetryToGetGCMToken() {
        let nextRetryTime = dispatch_time(DISPATCH_TIME_NOW, nextRetryInterval())
        dispatch_after(nextRetryTime, dispatch_get_main_queue()) { [unowned self] in
            self.receivedApnsToken(self.application, deviceApnsToken: self.appDelegate.apnsDeviceToken!)
        }
    } else {
        print("Out of retries to get GCM token. Permanent failure.")
    }

有没有办法在Java中使用队列?

1 个答案:

答案 0 :(得分:0)

这是一个处理请求并使用指数退避重新发送它们的基类。

在源代码中,您会找到:

  1. BackOffStrategy.java类
  2. 单位testBackOffStrategyTest.java
  3. 基本上,此代码可让您了解如何在调用失败时实施指数退避策略以重新发送请求。您可以配置重试次数和默认等待时间。在单元测试中,您将看到一些如何使用它的示例。您可以根据开发需求使其更复杂(处理自定义异常,等待更多时间,添加一些自定义逻辑等)。

    这是我实现的基类:

    1. 具有重试逻辑的后端Web服务
    2. 适用于FCM的XMPP连接服务器(Firebase云消息传递)
    3. https://github.com/carlosCharz/ExponentialBackOff

      我还在youtube上创建了一个视频,在那里我解释它的作用。

      https://www.youtube.com/watch?v=D8Dq99MDHtY

      希望你觉得它很有用。