@@ -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, | |||||
retryTimes + 1); | |||||
this.log.debug("微信系统繁忙,{} ms 后重试(第{}次)", sleepMillis, 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("微信服务端异常,超出重试次数"); | ||||
} | } | ||||
@@ -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); | ||||
@@ -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("微信服务端异常,超出重试次数"); | ||||
} | } | ||||
@@ -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[][] { | |||||
new Object[] { service } | |||||
}; | |||||
return new Object[][] { { service } }; | |||||
} | } | ||||
@Test(dataProvider = "getService", expectedExceptions = RuntimeException.class) | @Test(dataProvider = "getService", expectedExceptions = RuntimeException.class) | ||||