修复接口请求重试代码,避免无效等待

This commit is contained in:
Binary Wang
2016-12-15 15:23:29 +08:00
parent c0a325901a
commit b8a9795cf5
4 changed files with 34 additions and 23 deletions

View File

@@ -540,6 +540,12 @@ public class WxCpServiceImpl implements WxCpService {
try { try {
return executeInternal(executor, uri, data); return executeInternal(executor, uri, data);
} catch (WxErrorException e) { } catch (WxErrorException e) {
if (retryTimes + 1 > this.maxRetryTimes) {
this.log.warn("重试达到最大次数【{}】", this.maxRetryTimes);
//最后一次重试失败后,直接抛出异常,不再等待
throw new RuntimeException("微信服务端异常,超出重试次数");
}
WxError error = e.getError(); WxError error = e.getError();
/* /*
* -1 系统繁忙, 1000ms后重试 * -1 系统繁忙, 1000ms后重试
@@ -547,8 +553,7 @@ public class WxCpServiceImpl implements WxCpService {
if (error.getErrorCode() == -1) { if (error.getErrorCode() == -1) {
int sleepMillis = this.retrySleepMillis * (1 << retryTimes); int sleepMillis = this.retrySleepMillis * (1 << retryTimes);
try { try {
this.log.debug("微信系统繁忙,{}ms 后重试(第{}次)", sleepMillis, this.log.debug("微信系统繁忙,{} ms 后重试(第{}次)", sleepMillis, retryTimes + 1);
retryTimes + 1);
Thread.sleep(sleepMillis); Thread.sleep(sleepMillis);
} catch (InterruptedException e1) { } catch (InterruptedException e1) {
throw new RuntimeException(e1); throw new RuntimeException(e1);
@@ -557,8 +562,9 @@ public class WxCpServiceImpl implements WxCpService {
throw e; throw e;
} }
} }
} while (++retryTimes < this.maxRetryTimes); } while (retryTimes++ < this.maxRetryTimes);
this.log.warn("重试达到最大次数【{}】", this.maxRetryTimes);
throw new RuntimeException("微信服务端异常,超出重试次数"); throw new RuntimeException("微信服务端异常,超出重试次数");
} }

View File

@@ -1,17 +1,16 @@
package me.chanjar.weixin.cp.api; package me.chanjar.weixin.cp.api;
import me.chanjar.weixin.common.bean.result.WxError;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestExecutor;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import me.chanjar.weixin.common.bean.result.WxError;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestExecutor;
@Test @Test
public class WxCpBusyRetryTest { public class WxCpBusyRetryTest {
@@ -23,6 +22,7 @@ public class WxCpBusyRetryTest {
protected synchronized <T, E> T executeInternal( protected synchronized <T, E> T executeInternal(
RequestExecutor<T, E> executor, String uri, E data) RequestExecutor<T, E> executor, String uri, E data)
throws WxErrorException { throws WxErrorException {
this.log.info("Executed");
WxError error = new WxError(); WxError error = new WxError();
error.setErrorCode(-1); error.setErrorCode(-1);
throw new WxErrorException(error); throw new WxErrorException(error);

View File

@@ -369,12 +369,18 @@ public class WxMpServiceImpl implements WxMpService {
this.log.debug("\n[URL]: {}\n[PARAMS]: {}\n[RESPONSE]: {}",uri, data, result); this.log.debug("\n[URL]: {}\n[PARAMS]: {}\n[RESPONSE]: {}",uri, data, result);
return result; return result;
} catch (WxErrorException e) { } catch (WxErrorException e) {
if (retryTimes + 1 > this.maxRetryTimes) {
this.log.warn("重试达到最大次数【{}】", maxRetryTimes);
//最后一次重试失败后,直接抛出异常,不再等待
throw new RuntimeException("微信服务端异常,超出重试次数");
}
WxError error = e.getError(); WxError error = e.getError();
// -1 系统繁忙, 1000ms后重试 // -1 系统繁忙, 1000ms后重试
if (error.getErrorCode() == -1) { if (error.getErrorCode() == -1) {
int sleepMillis = this.retrySleepMillis * (1 << retryTimes); int sleepMillis = this.retrySleepMillis * (1 << retryTimes);
try { try {
this.log.debug("微信系统繁忙,{}ms 后重试(第{}次)", sleepMillis, retryTimes + 1); this.log.warn("微信系统繁忙,{} ms 后重试(第{}次)", sleepMillis, retryTimes + 1);
Thread.sleep(sleepMillis); Thread.sleep(sleepMillis);
} catch (InterruptedException e1) { } catch (InterruptedException e1) {
throw new RuntimeException(e1); throw new RuntimeException(e1);
@@ -383,8 +389,9 @@ public class WxMpServiceImpl implements WxMpService {
throw e; throw e;
} }
} }
} while (++retryTimes < this.maxRetryTimes); } while (retryTimes++ < this.maxRetryTimes);
this.log.warn("重试达到最大次数【{}】", this.maxRetryTimes);
throw new RuntimeException("微信服务端异常,超出重试次数"); throw new RuntimeException("微信服务端异常,超出重试次数");
} }

View File

@@ -1,17 +1,16 @@
package me.chanjar.weixin.mp.api; package me.chanjar.weixin.mp.api;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.bean.result.WxError;
import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestExecutor; import me.chanjar.weixin.common.util.http.RequestExecutor;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
@Test @Test
public class WxMpBusyRetryTest { public class WxMpBusyRetryTest {
@@ -24,6 +23,7 @@ public class WxMpBusyRetryTest {
protected synchronized <T, E> T executeInternal( protected synchronized <T, E> T executeInternal(
RequestExecutor<T, E> executor, String uri, E data) RequestExecutor<T, E> executor, String uri, E data)
throws WxErrorException { throws WxErrorException {
this.log.info("Executed");
WxError error = new WxError(); WxError error = new WxError();
error.setErrorCode(-1); error.setErrorCode(-1);
throw new WxErrorException(error); throw new WxErrorException(error);
@@ -32,9 +32,7 @@ public class WxMpBusyRetryTest {
service.setMaxRetryTimes(3); service.setMaxRetryTimes(3);
service.setRetrySleepMillis(500); service.setRetrySleepMillis(500);
return new Object[][] { return new Object[][] { { service } };
new Object[] { service }
};
} }
@Test(dataProvider = "getService", expectedExceptions = RuntimeException.class) @Test(dataProvider = "getService", expectedExceptions = RuntimeException.class)