package tech.powerjob.remote.framework; import lombok.Data; import lombok.experimental.Accessors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; import tech.powerjob.common.PowerSerializable; import tech.powerjob.common.utils.CommonUtils; import tech.powerjob.remote.framework.actor.Actor; import tech.powerjob.remote.framework.actor.Handler; import java.util.Optional; /** * 基准测试 * * @author tjq * @since 2023/1/1 */ @Slf4j @Actor(path = "benchmark") public class BenchmarkActor { @Handler(path = "standard") public BenchmarkResponse standardRequest(BenchmarkRequest request) { long startTs = System.currentTimeMillis(); log.info("[BenchmarkActor] [standardRequest] receive request: {}", request); BenchmarkResponse response = new BenchmarkResponse() .setSuccess(true) .setContent(request.getContent()) .setProcessThread(Thread.currentThread().getName()) .setServerReceiveTs(System.currentTimeMillis()); if (request.getResponseSize() != null && request.getResponseSize() > 0) { response.setExtra(RandomStringUtils.randomPrint(request.getResponseSize())); } executeSleep(request); response.setServerCost(System.currentTimeMillis() - startTs); return response; } @Handler(path = "emptyReturn") public void emptyReturn(BenchmarkRequest request) { log.info("[BenchmarkActor] [emptyReturn] receive request: {}", request); executeSleep(request); } @Handler(path = "stringReturn") public String stringReturn(BenchmarkRequest request) { log.info("[BenchmarkActor] [stringReturn] receive request: {}", request); executeSleep(request); return RandomStringUtils.randomPrint(Optional.ofNullable(request.getResponseSize()).orElse(100)); } private static void executeSleep(BenchmarkRequest request) { if (request.getBlockingMills() != null && request.getBlockingMills() > 0) { CommonUtils.easySleep(request.getBlockingMills()); } } @Data @Accessors(chain = true) public static class BenchmarkRequest implements PowerSerializable { /** * 请求内容 */ private String content; /** * 期望的响应大小,可空 */ private Integer responseSize; /** * 阻塞时间,模拟 IO 耗时 */ private Integer blockingMills; } @Data @Accessors(chain = true) public static class BenchmarkResponse implements PowerSerializable { private boolean success; /** * 原路返回原来的 content */ private String content; private String processThread; private long serverReceiveTs; private long serverCost; private String extra; } }