feat: 1.3.0

1. 重构上报模块
2. 使用策略模式,通过异步、同步执行不同的策略方法
This commit is contained in:
www.byteblogs.com 2023-05-15 23:21:33 +08:00 committed by byteblogs168
parent ff42df5229
commit ddfe1a2ce2
11 changed files with 267 additions and 256 deletions

View File

@ -0,0 +1,95 @@
package com.aizuda.easy.retry.client.core.report;
import cn.hutool.core.lang.Assert;
import com.aizuda.easy.retry.client.core.IdempotentIdGenerate;
import com.aizuda.easy.retry.client.core.RetryArgSerializer;
import com.aizuda.easy.retry.client.core.cache.RetryerInfoCache;
import com.aizuda.easy.retry.client.core.config.EasyRetryProperties;
import com.aizuda.easy.retry.client.core.exception.EasyRetryClientException;
import com.aizuda.easy.retry.client.core.intercepter.RetrySiteSnapshot;
import com.aizuda.easy.retry.client.core.retryer.RetryerInfo;
import com.aizuda.easy.retry.client.core.spel.SPELParamFunction;
import com.aizuda.easy.retry.client.core.window.RetryLeapArray;
import com.aizuda.easy.retry.common.core.log.LogUtils;
import com.aizuda.easy.retry.server.model.dto.RetryTaskDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Method;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.function.Function;
/**
* @author www.byteblogs.com
* @date 2023-05-15
* @since 2.0
*/
@Slf4j
public abstract class AbstractReport implements Report {
@Autowired
@Qualifier("easyRetryJacksonSerializer")
private RetryArgSerializer retryArgSerializer;
public static final int SAMPLE_COUNT = 10;
public static final int INTERVAL_IN_MS = 1000;
@Override
public boolean report(String scene, final String targetClassName, final Object[] params) {
RetryerInfo retryerInfo = RetryerInfoCache.get(scene, targetClassName);
Assert.notNull(retryerInfo, () -> new EasyRetryClientException("retryerInfo is null"));
if (RetrySiteSnapshot.getStage().equals(RetrySiteSnapshot.EnumStage.REMOTE.getStage()) && !retryerInfo.isForceReport()) {
LogUtils.info(log, "已经上报成功,无需重复上报 scene:[{}] targetClassName:[{}] args:[{}]",
retryerInfo.getScene(), retryerInfo.getExecutorClassName(), params);
return Boolean.TRUE;
}
return doReport(retryerInfo, params);
}
public abstract boolean doReport(RetryerInfo retryerInfo, Object[] params);
/**
* 构建上报任务对象
*
* @param scene 场景
* @param targetClassName 执行对象
* @param args 参数
* @return RetryTaskDTO 上报服务端对象
*/
protected RetryTaskDTO buildRetryTaskDTO(final String scene, final String targetClassName, final Object[] args) {
RetryerInfo retryerInfo = RetryerInfoCache.get(scene, targetClassName);
Method executorMethod = retryerInfo.getMethod();
RetryTaskDTO retryTaskDTO = new RetryTaskDTO();
String idempotentId;
try {
Class<? extends IdempotentIdGenerate> idempotentIdGenerate = retryerInfo.getIdempotentIdGenerate();
IdempotentIdGenerate generate = idempotentIdGenerate.newInstance();
Method method = idempotentIdGenerate.getMethod("idGenerate", Object[].class);
Object p = new Object[]{scene, targetClassName, args, executorMethod.getName()};
idempotentId = (String) ReflectionUtils.invokeMethod(method, generate, p);
} catch (Exception exception) {
LogUtils.error(log, "幂等id生成异常{},{}", scene, args, exception);
throw new EasyRetryClientException("idempotentId生成异常{},{}", scene, args);
}
String serialize = retryArgSerializer.serialize(args);
retryTaskDTO.setIdempotentId(idempotentId);
retryTaskDTO.setExecutorName(targetClassName);
retryTaskDTO.setArgsStr(serialize);
retryTaskDTO.setGroupName(EasyRetryProperties.getGroup());
retryTaskDTO.setSceneName(scene);
String bizNoSpel = retryerInfo.getBizNo();
Function<Object[], String> spelParamFunction = new SPELParamFunction(bizNoSpel, executorMethod);
retryTaskDTO.setBizNo(spelParamFunction.apply(args));
return retryTaskDTO;
}
}

View File

@ -0,0 +1,69 @@
package com.aizuda.easy.retry.client.core.report;
import com.aizuda.easy.retry.client.core.Lifecycle;
import com.aizuda.easy.retry.client.core.client.NettyClient;
import com.aizuda.easy.retry.client.core.client.proxy.RequestBuilder;
import com.aizuda.easy.retry.client.core.retryer.RetryerInfo;
import com.aizuda.easy.retry.client.core.window.RetryLeapArray;
import com.aizuda.easy.retry.common.core.log.LogUtils;
import com.aizuda.easy.retry.common.core.model.NettyResult;
import com.aizuda.easy.retry.common.core.util.JsonUtil;
import com.aizuda.easy.retry.server.model.dto.RetryTaskDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* @author www.byteblogs.com
* @date 2023-05-15
* @since 1.3.0
*/
@Component
@Slf4j
public class AsyncReport extends AbstractReport implements Lifecycle {
private static ScheduledExecutorService dispatchService = Executors.newSingleThreadScheduledExecutor(r -> new Thread(r, "DispatchService"));
public static RetryLeapArray slidingWindow = new RetryLeapArray(SAMPLE_COUNT, INTERVAL_IN_MS, new ReportListener());
@Override
public boolean supports(boolean async) {
return async;
}
@Override
public boolean doReport(RetryerInfo retryerInfo, Object[] params) {
return syncReport(retryerInfo.getScene(), retryerInfo.getExecutorClassName(), params, retryerInfo.getTimeout(), retryerInfo.getUnit());
}
/**
* 异步上报到服务端, 若当前处于远程重试阶段不会进行执行上报
*/
public Boolean syncReport(String scene, String targetClassName, Object[] args, long timeout, TimeUnit unit) {
RetryTaskDTO retryTaskDTO = buildRetryTaskDTO(scene, targetClassName, args);
slidingWindow.currentWindow().value().add(retryTaskDTO);
return Boolean.TRUE;
}
@Override
public void start() {
dispatchService.scheduleAtFixedRate(() -> {
slidingWindow.currentWindow();
}, INTERVAL_IN_MS, INTERVAL_IN_MS / SAMPLE_COUNT, TimeUnit.MILLISECONDS);
}
@Override
public void close() {
log.info("reportHandler about to shutdown");
slidingWindow.currentWindow();
log.info("reportHandler has been shutdown");
}
}

View File

@ -0,0 +1,15 @@
package com.aizuda.easy.retry.client.core.report;
import com.aizuda.easy.retry.client.core.retryer.RetryerInfo;
/**
* @author www.byteblogs.com
* @date 2023-05-15
* @since 2.0
*/
public interface Report {
boolean supports(boolean async);
boolean report(String scene, final String targetClassName, final Object[] args);
}

View File

@ -1,169 +0,0 @@
package com.aizuda.easy.retry.client.core.report;
import com.aizuda.easy.retry.client.core.IdempotentIdGenerate;
import com.aizuda.easy.retry.client.core.RetryArgSerializer;
import com.aizuda.easy.retry.client.core.client.NettyClient;
import com.aizuda.easy.retry.client.core.client.proxy.RequestBuilder;
import com.aizuda.easy.retry.client.core.config.EasyRetryProperties;
import com.aizuda.easy.retry.client.core.Lifecycle;
import com.aizuda.easy.retry.client.core.cache.RetryerInfoCache;
import com.aizuda.easy.retry.client.core.exception.EasyRetryClientException;
import com.aizuda.easy.retry.client.core.intercepter.RetrySiteSnapshot;
import com.aizuda.easy.retry.client.core.retryer.RetryerInfo;
import com.aizuda.easy.retry.client.core.spel.SPELParamFunction;
import com.aizuda.easy.retry.client.core.window.RetryLeapArray;
import com.aizuda.easy.retry.common.core.log.LogUtils;
import com.aizuda.easy.retry.common.core.model.NettyResult;
import com.aizuda.easy.retry.common.core.model.Result;
import com.aizuda.easy.retry.common.core.util.JsonUtil;
import com.aizuda.easy.retry.server.model.dto.RetryTaskDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
/**
* 上报服务端
*
* @author: www.byteblogs.com
* @date : 2022-03-08 09:24
* @since 1.0.0
*/
@Component
@Slf4j
public class ReportHandler implements Lifecycle {
@Autowired
@Qualifier("XRetryJacksonSerializer")
private RetryArgSerializer retryArgSerializer;
public static final int SAMPLE_COUNT = 10;
public static final int INTERVAL_IN_MS = 1000;
private static ScheduledExecutorService dispatchService = Executors.newSingleThreadScheduledExecutor(r -> new Thread(r, "DispatchService"));
public static RetryLeapArray slidingWindow = new RetryLeapArray(SAMPLE_COUNT, INTERVAL_IN_MS, new ReportListener());
/**
* 异步上报到服务端, 若当前处于远程重试阶段不会进行执行上报
*/
public Boolean syncReport(String scene, String targetClassName, Object[] args, long timeout, TimeUnit unit) {
if (RetrySiteSnapshot.getStage().equals(RetrySiteSnapshot.EnumStage.REMOTE.getStage())) {
LogUtils.info(log,"已经上报成功,无需重复上报 scene:[{}] targetClassName:[{}] args:[{}]", scene, targetClassName, args);
return Boolean.TRUE;
}
return syncReportWithForce(scene, targetClassName, args, timeout, unit);
}
/**
* 异步上报到服务端, 若当前处于远程重试阶段不会进行执行上报
*/
public Boolean syncReportWithForce(String scene, String targetClassName, Object[] args, long timeout, TimeUnit unit) {
RetryTaskDTO retryTaskDTO = buildRetryTaskDTO(scene, targetClassName, args);
NettyClient CLIENT = RequestBuilder.<NettyClient, NettyResult>newBuilder()
.client(NettyClient.class)
.async(Boolean.FALSE)
.timeout(timeout)
.unit(unit)
.build();
NettyResult result = CLIENT.reportRetryInfo(Arrays.asList(retryTaskDTO));
LogUtils.debug(log, "Data report result result:[{}]", JsonUtil.toJsonString(result));
return (Boolean) result.getData();
}
/**
* 异步上报到服务端, 若当前处于远程重试阶段不会进行执行上报
*/
public Boolean asyncReport(String scene, String targetClassName, Object[] args) {
if (RetrySiteSnapshot.getStage().equals(RetrySiteSnapshot.EnumStage.REMOTE.getStage())) {
LogUtils.info(log,"已经上报成功,无需重复上报 scene:[{}] targetClassName:[{}] args:[{}]", scene, targetClassName, args);
return Boolean.TRUE;
}
RetryTaskDTO retryTaskDTO = buildRetryTaskDTO(scene, targetClassName, args);
slidingWindow.currentWindow().value().add(retryTaskDTO);
return true;
}
/**
* 不需要校验强制当前是否处于远程重试阶段强制异步上报到服务端
*/
public Boolean asyncReportWithForce(String scene, String targetClassName, Object[] args) {
RetryTaskDTO retryTaskDTO = buildRetryTaskDTO(scene, targetClassName, args);
slidingWindow.currentWindow().value().add(retryTaskDTO);
return true;
}
/**
* 构建上报任务对象
*
* @param scene 场景
* @param targetClassName 执行对象
* @param args 参数
* @return RetryTaskDTO 上报服务端对象
*/
private RetryTaskDTO buildRetryTaskDTO(final String scene, final String targetClassName, final Object[] args) {
RetryerInfo retryerInfo = RetryerInfoCache.get(scene, targetClassName);
Method executorMethod = retryerInfo.getMethod();
RetryTaskDTO retryTaskDTO = new RetryTaskDTO();
String idempotentId;
try {
Class<? extends IdempotentIdGenerate> idempotentIdGenerate = retryerInfo.getIdempotentIdGenerate();
IdempotentIdGenerate generate = idempotentIdGenerate.newInstance();
Method method = idempotentIdGenerate.getMethod("idGenerate", Object[].class);
Object p = new Object[]{scene, targetClassName, args, executorMethod.getName()};
idempotentId = (String) ReflectionUtils.invokeMethod(method, generate, p);
} catch (Exception exception) {
LogUtils.error(log, "幂等id生成异常{},{}", scene, args, exception);
throw new EasyRetryClientException("idempotentId生成异常{},{}", scene, args);
}
String serialize = retryArgSerializer.serialize(args);
retryTaskDTO.setIdempotentId(idempotentId);
retryTaskDTO.setExecutorName(targetClassName);
retryTaskDTO.setArgsStr(serialize);
retryTaskDTO.setGroupName(EasyRetryProperties.getGroup());
retryTaskDTO.setSceneName(scene);
String bizNoSpel = retryerInfo.getBizNo();
Function<Object[], String> spelParamFunction = new SPELParamFunction(bizNoSpel, executorMethod);
retryTaskDTO.setBizNo(spelParamFunction.apply(args));
return retryTaskDTO;
}
@Override
public void start() {
dispatchService.scheduleAtFixedRate(() -> {
slidingWindow.currentWindow();
}, INTERVAL_IN_MS, INTERVAL_IN_MS / SAMPLE_COUNT, TimeUnit.MILLISECONDS);
}
@Override
public void close() {
log.info("reportHandler about to shutdown");
slidingWindow.currentWindow();
log.info("reportHandler has been shutdown");
}
}

View File

@ -0,0 +1,59 @@
package com.aizuda.easy.retry.client.core.report;
import com.aizuda.easy.retry.client.core.client.NettyClient;
import com.aizuda.easy.retry.client.core.client.proxy.RequestBuilder;
import com.aizuda.easy.retry.client.core.intercepter.RetrySiteSnapshot;
import com.aizuda.easy.retry.client.core.retryer.RetryerInfo;
import com.aizuda.easy.retry.common.core.log.LogUtils;
import com.aizuda.easy.retry.common.core.model.NettyResult;
import com.aizuda.easy.retry.common.core.util.JsonUtil;
import com.aizuda.easy.retry.server.model.dto.RetryTaskDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
/**
* @author www.byteblogs.com
* @date 2023-05-15
* @since 1.3.0
*/
@Component
@Slf4j
public class SyncReport extends AbstractReport {
@Override
public boolean supports(boolean async) {
return !async;
}
@Override
public boolean doReport(RetryerInfo retryerInfo, Object[] params) {
return syncReport(retryerInfo.getScene(), retryerInfo.getExecutorClassName(), params, retryerInfo.getTimeout(), retryerInfo.getUnit());
}
/**
* 异步上报到服务端, 若当前处于远程重试阶段不会进行执行上报
*/
public Boolean syncReport(String scene, String targetClassName, Object[] args, long timeout, TimeUnit unit) {
RetryTaskDTO retryTaskDTO = buildRetryTaskDTO(scene, targetClassName, args);
NettyClient CLIENT = RequestBuilder.<NettyClient, NettyResult>newBuilder()
.client(NettyClient.class)
.async(Boolean.FALSE)
.timeout(timeout)
.unit(unit)
.build();
NettyResult result = CLIENT.reportRetryInfo(Collections.singletonList(retryTaskDTO));
LogUtils.debug(log, "Data report result result:[{}]", JsonUtil.toJsonString(result));
return (Boolean) result.getData();
}
}

View File

@ -16,7 +16,7 @@ import java.lang.reflect.Type;
* @author: www.byteblogs.com
* @date : 2022-03-07 15:08
*/
@Component("XRetryJacksonSerializer")
@Component("easyRetryJacksonSerializer")
public class JacksonSerializer implements RetryArgSerializer {
@Override

View File

@ -4,6 +4,7 @@ import com.aizuda.easy.retry.client.core.RetryExecutor;
import com.aizuda.easy.retry.client.core.RetryExecutorParameter;
import com.aizuda.easy.retry.client.core.event.EasyRetryListener;
import com.aizuda.easy.retry.client.core.intercepter.RetrySiteSnapshot;
import com.aizuda.easy.retry.client.core.report.Report;
import com.github.rholder.retry.Retryer;
import com.github.rholder.retry.StopStrategy;
import com.github.rholder.retry.WaitStrategy;
@ -29,6 +30,9 @@ public abstract class AbstractRetryStrategies implements RetryStrategy {
@Autowired
private List<EasyRetryListener> easyRetryListeners;
@Autowired
private List<Report> reports;
@Override
public RetryerResultContext openRetry(String sceneName, String executorClassName, Object[] params) {
@ -147,5 +151,21 @@ public abstract class AbstractRetryStrategies implements RetryStrategy {
return false;
}
/**
* 上报数据
*
* @param retryerInfo 定义重试场景的信息
* @param params 执行参数
*/
protected boolean doReport(final RetryerInfo retryerInfo, final Object[] params) {
for (Report report : reports) {
if (report.supports(retryerInfo.isAsync())) {
return report.report(retryerInfo.getScene(), retryerInfo.getExecutorClassName(), params);
}
}
return Boolean.FALSE;
}
}

View File

@ -4,7 +4,6 @@ import com.aizuda.easy.retry.client.core.RetryExecutor;
import com.aizuda.easy.retry.client.core.RetryExecutorParameter;
import com.aizuda.easy.retry.client.core.exception.EasyRetryClientException;
import com.aizuda.easy.retry.client.core.intercepter.RetrySiteSnapshot;
import com.aizuda.easy.retry.client.core.report.ReportHandler;
import com.aizuda.easy.retry.client.core.retryer.RetryType;
import com.aizuda.easy.retry.client.core.retryer.RetryerInfo;
import com.aizuda.easy.retry.client.core.retryer.RetryerResultContext;
@ -18,7 +17,6 @@ import com.github.rholder.retry.WaitStrategies;
import com.github.rholder.retry.WaitStrategy;
import com.google.common.base.Predicate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Collections;
@ -28,16 +26,16 @@ import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
/**
* 执行本地重试
*
* @author: www.byteblogs.com
* @date : 2022-03-03 14:38
* @since 1.3.0
*/
@Component
@Slf4j
public class LocalRetryStrategies extends AbstractRetryStrategies {
@Autowired
private ReportHandler reportHandler;
@Override
public boolean supports(int stage, RetryType retryType) {
return RetrySiteSnapshot.EnumStage.LOCAL.getStage() == stage ;
@ -125,31 +123,6 @@ public class LocalRetryStrategies extends AbstractRetryStrategies {
}
/**
* 上报数据
*
* @param retryerInfo 定义重试场景的信息
* @param params 执行参数
*/
private void doReport(final RetryerInfo retryerInfo, final Object[] params) {
if (retryerInfo.isAsync()) {
if (retryerInfo.isForceReport()) {
reportHandler.asyncReportWithForce(retryerInfo.getScene(), retryerInfo.getExecutorClassName(), params);
} else {
reportHandler.asyncReport(retryerInfo.getScene(), retryerInfo.getExecutorClassName(), params);
}
} else {
if (retryerInfo.isForceReport()) {
reportHandler.syncReport(retryerInfo.getScene(), retryerInfo.getExecutorClassName(),
params, retryerInfo.getTimeout(), retryerInfo.getUnit());
} else {
reportHandler.syncReport(retryerInfo.getScene(), retryerInfo.getExecutorClassName(),
params, retryerInfo.getTimeout(), retryerInfo.getUnit());
}
}
}
@Override
public RetryExecutorParameter<WaitStrategy, StopStrategy> getRetryExecutorParameter(RetryerInfo retryerInfo) {

View File

@ -3,7 +3,6 @@ package com.aizuda.easy.retry.client.core.strategy;
import com.aizuda.easy.retry.client.core.RetryExecutor;
import com.aizuda.easy.retry.client.core.RetryExecutorParameter;
import com.aizuda.easy.retry.client.core.intercepter.RetrySiteSnapshot;
import com.aizuda.easy.retry.client.core.report.ReportHandler;
import com.aizuda.easy.retry.client.core.retryer.RetryType;
import com.aizuda.easy.retry.client.core.retryer.RetryerInfo;
import com.aizuda.easy.retry.client.core.retryer.RetryerResultContext;
@ -17,7 +16,6 @@ import com.github.rholder.retry.WaitStrategies;
import com.github.rholder.retry.WaitStrategy;
import com.google.common.base.Predicate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Collections;
@ -27,6 +25,8 @@ import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
/**
* 手动执行重试
*
* @author: www.byteblogs.com
* @date : 2023-05-15 18:19
*/
@ -34,9 +34,6 @@ import java.util.function.Consumer;
@Slf4j
public class ManualRetryStrategies extends AbstractRetryStrategies {
@Autowired
private ReportHandler reportHandler;
@Override
protected void setStage() {
RetrySiteSnapshot.setStage(RetrySiteSnapshot.EnumStage.MANUAL_REPORT.getStage());
@ -94,32 +91,6 @@ public class ManualRetryStrategies extends AbstractRetryStrategies {
}
/**
* 上报数据
*
* @param retryerInfo 定义重试场景的信息
* @param params 执行参数
*/
private boolean doReport(final RetryerInfo retryerInfo, final Object[] params) {
if (retryerInfo.isAsync()) {
if (retryerInfo.isForceReport()) {
return reportHandler
.asyncReportWithForce(retryerInfo.getScene(), retryerInfo.getExecutorClassName(), params);
} else {
return reportHandler.asyncReport(retryerInfo.getScene(), retryerInfo.getExecutorClassName(), params);
}
} else {
if (retryerInfo.isForceReport()) {
return reportHandler.syncReport(retryerInfo.getScene(), retryerInfo.getExecutorClassName(),
params, retryerInfo.getTimeout(), retryerInfo.getUnit());
} else {
return reportHandler.syncReport(retryerInfo.getScene(), retryerInfo.getExecutorClassName(),
params, retryerInfo.getTimeout(), retryerInfo.getUnit());
}
}
}
@Override
protected RetryExecutorParameter<WaitStrategy, StopStrategy> getRetryExecutorParameter(RetryerInfo retryerInfo) {
return new RetryExecutorParameter<WaitStrategy, StopStrategy>() {

View File

@ -20,8 +20,11 @@ import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
/**
* 执行远程重试
*
* @author: www.byteblogs.com
* @date : 2022-03-03 14:38
* @since 1.3.0
*/
@Component
@Slf4j

View File

@ -1,21 +1,15 @@
package com.example;
import com.aizuda.easy.retry.client.core.report.ReportHandler;
import com.aizuda.easy.retry.client.core.window.RetryLeapArray;
import com.aizuda.easy.retry.common.core.model.Result;
import com.aizuda.easy.retry.server.model.dto.RetryTaskDTO;
import com.example.client.DemoClient;
import com.example.mapper.SchoolMapper;
import com.example.po.School;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.web.client.RestTemplate;
import java.util.concurrent.ConcurrentLinkedQueue;
@SpringBootTest
@Slf4j
public class ExampleApplicationTests {
@ -26,8 +20,6 @@ public class ExampleApplicationTests {
@Autowired
private RestTemplate restTemplate;
private RetryLeapArray retryLeapArray = ReportHandler.slidingWindow;
@Autowired(required = false)
private DemoClient demoClient;
@ -51,21 +43,4 @@ public class ExampleApplicationTests {
System.out.println(template);
}
@SneakyThrows
@Test
public void windows() {
for (int i = 0; i < 100000; i++) {
int finalI = i;
new Thread(() -> {
RetryTaskDTO retryTaskDTO = new RetryTaskDTO();
retryTaskDTO.setIdempotentId(finalI + "");
ConcurrentLinkedQueue<RetryTaskDTO> value = retryLeapArray.currentWindow().value();
value.add(retryTaskDTO);
}).start();
}
Thread.sleep(5 * 1000);
}
}