From 689ff7a9d203420b9e33cb507e1f0bc32b13ea3d Mon Sep 17 00:00:00 2001 From: byteblogs168 <598092184@qq.com> Date: Sat, 14 Jan 2023 19:58:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=9A=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=9C=AA=E4=B8=8A=E4=BC=A0=E5=BC=82=E5=B8=B8=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/src/main/resources/application.yml | 2 +- .../ExistsTransactionalRetryServiceTest.java | 29 +++++++++++++++++-- .../client/core/intercepter/RetryAspect.java | 17 ++++++----- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/example/src/main/resources/application.yml b/example/src/main/resources/application.yml index 604b6c2b5..4ef2c80af 100644 --- a/example/src/main/resources/application.yml +++ b/example/src/main/resources/application.yml @@ -38,4 +38,4 @@ logging: x-retry: server: - host: 192.168.100.3 + host: 127.0.0.1 diff --git a/example/src/test/java/com/example/ExistsTransactionalRetryServiceTest.java b/example/src/test/java/com/example/ExistsTransactionalRetryServiceTest.java index d57815a6e..391feb71f 100644 --- a/example/src/test/java/com/example/ExistsTransactionalRetryServiceTest.java +++ b/example/src/test/java/com/example/ExistsTransactionalRetryServiceTest.java @@ -13,8 +13,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import java.util.UUID; - -import static org.awaitility.Awaitility.await; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** * @author: www.byteblogs.com @@ -74,4 +75,28 @@ public class ExistsTransactionalRetryServiceTest { Thread.sleep(90000); } + + @SneakyThrows + @Test + public void syncTestSimpleInsert() { + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); + + Mockito.when(remoteService.call()) + .thenReturn(new Result(0, "1")) + .thenReturn(new Result(0, "2")) + .thenReturn(new Result(0, "3")) + .thenReturn(new Result(0, "4")) + .thenReturn(new Result(0, "5")) + ; + try { + for (int i = 0; i < 100; i++) { + threadPoolExecutor.execute(() -> testExistsTransactionalRetryService.testSimpleInsert(UUID.randomUUID().toString())); + } + } catch (Exception e) { + log.error("", e); + } + + Thread.sleep(900000); + + } } diff --git a/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/RetryAspect.java b/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/RetryAspect.java index 5b94fe85a..6a6d0d3fc 100644 --- a/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/RetryAspect.java +++ b/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/RetryAspect.java @@ -74,13 +74,13 @@ public class RetryAspect { private void doHandlerRetry(ProceedingJoinPoint point, String traceId, Retryable retryable, String executorClassName, String methodEntrance, Throwable throwable) { - if (!RetrySiteSnapshot.isMethodEntrance(methodEntrance) || RetrySiteSnapshot.isRunning() || Objects.isNull(throwable)) { + if (!RetrySiteSnapshot.isMethodEntrance(methodEntrance)) { return; } if (!TransactionSynchronizationManager.isActualTransactionActive()) { // 无事务, 开启重试 - openRetry(point, traceId, retryable, executorClassName); + openRetry(point, traceId, retryable, executorClassName, throwable); return; } @@ -89,17 +89,18 @@ public class RetryAspect { @Override public void afterCompletion(int status) { - if (STATUS_ROLLED_BACK == status) { - - // 有事务开启重试 - openRetry(point, traceId, retryable, executorClassName); - } + // 有事务开启重试 + openRetry(point, traceId, retryable, executorClassName, throwable); } }); } - private void openRetry(ProceedingJoinPoint point, String traceId, Retryable retryable, String executorClassName) { + private void openRetry(ProceedingJoinPoint point, String traceId, Retryable retryable, String executorClassName, Throwable throwable) { try { + if (Objects.isNull(throwable) || RetrySiteSnapshot.isRunning()) { + return; + } + RetryerResultContext context = retryStrategy.openRetry(retryable.scene(), executorClassName, point.getArgs()); if (RetryResultStatusEnum.SUCCESS.getStatus().equals(context.getRetryResultStatusEnum().getStatus())) { LogUtils.debug("aop 结果成功 traceId:[{}] result:[{}]", traceId, context.getResult());