1、升级 jdk 25

2、升级 springBoot 3.5.7
 3、升级 guava 33.5.0-jre
 4、升级动态线程池 dynamic-tp-spring-boot-starter-apollo  1.2.2-x
 5、升级 mysql 驱动 8.0.33
 6、去除老版本发送邮件 javax.mail 改为 spring-boot-starter-mail
 7、ReceiverStarter 改为 KafkaConsumerConfig,避免循环依赖
feature_jdk_25
3y 1 month ago
parent e7947c57c7
commit a460055947

@ -17,6 +17,11 @@
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--fastjson2-->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
</dependency>
</dependencies>
</project>

@ -1,5 +1,7 @@
package com.java3y.austin.common.dto.model;
import com.alibaba.fastjson2.annotation.JSONType;
import java.io.Serializable;
/**
@ -8,6 +10,20 @@ import java.io.Serializable;
*
* @author 3y
*/
@JSONType(seeAlso = {
EmailContentModel.class,
SmsContentModel.class,
PushContentModel.class,
OfficialAccountsContentModel.class,
MiniProgramContentModel.class,
AlipayMiniProgramContentModel.class,
EnterpriseWeChatContentModel.class,
EnterpriseWeChatRobotContentModel.class,
FeiShuRobotContentModel.class,
DingDingRobotContentModel.class,
DingDingWorkContentModel.class,
ImContentModel.class
})
public class ContentModel implements Serializable {

@ -1,10 +1,10 @@
package com.java3y.austin.cron.config;
import cn.hutool.core.thread.ExecutorBuilder;
import com.dtp.common.em.QueueTypeEnum;
import com.dtp.common.em.RejectedTypeEnum;
import com.dtp.core.thread.DtpExecutor;
import com.dtp.core.thread.ThreadPoolBuilder;
import org.dromara.dynamictp.common.em.QueueTypeEnum;
import org.dromara.dynamictp.common.em.RejectedTypeEnum;
import org.dromara.dynamictp.core.executor.DtpExecutor;
import org.dromara.dynamictp.core.support.ThreadPoolBuilder;
import com.java3y.austin.common.constant.ThreadPoolConstant;
import java.util.concurrent.ExecutorService;

@ -1,6 +1,6 @@
package com.java3y.austin.cron.handler;
import com.dtp.core.thread.DtpExecutor;
import org.dromara.dynamictp.core.executor.DtpExecutor;
import com.java3y.austin.cron.config.CronAsyncThreadPoolConfig;
import com.java3y.austin.cron.service.TaskHandler;
import com.java3y.austin.support.utils.ThreadPoolUtils;

@ -34,10 +34,10 @@
</exclusions>
</dependency>
<!--邮件发送-->
<!--邮件发送Spring Boot 3.x 使用 Jakarta Mail通过 starter 引入)-->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--企业微信发送消息-->

@ -1,9 +1,9 @@
package com.java3y.austin.handler.config;
import com.dtp.common.em.QueueTypeEnum;
import com.dtp.common.em.RejectedTypeEnum;
import com.dtp.core.thread.DtpExecutor;
import com.dtp.core.thread.ThreadPoolBuilder;
import org.dromara.dynamictp.common.em.QueueTypeEnum;
import org.dromara.dynamictp.common.em.RejectedTypeEnum;
import org.dromara.dynamictp.core.executor.DtpExecutor;
import org.dromara.dynamictp.core.support.ThreadPoolBuilder;
import com.java3y.austin.common.constant.ThreadPoolConstant;
import java.util.concurrent.TimeUnit;

@ -17,7 +17,6 @@ import com.java3y.austin.handler.flowcontrol.FlowControlParam;
import com.java3y.austin.handler.handler.BaseHandler;
import com.java3y.austin.support.utils.AccountUtils;
import com.java3y.austin.support.utils.AustinFileUtils;
import com.sun.mail.util.MailSSLSocketFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@ -80,9 +79,11 @@ public class EmailHandler extends BaseHandler{
private MailAccount getAccountConfig(Integer sendAccount) {
MailAccount account = accountUtils.getAccountById(sendAccount, MailAccount.class);
try {
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
account.setAuth(account.isAuth()).setStarttlsEnable(account.isStarttlsEnable()).setSslEnable(account.isSslEnable()).setCustomProperty("mail.smtp.ssl.socketFactory", sf);
account.setAuth(account.isAuth())
.setStarttlsEnable(account.isStarttlsEnable())
.setSslEnable(account.isSslEnable())
.setCustomProperty("mail.smtp.ssl.trust", "*") // 信任所有主机
.setCustomProperty("mail.smtp.ssl.checkserveridentity", "false"); // 禁用服务器身份验证
account.setTimeout(25000).setConnectionTimeout(25000);
} catch (Exception e) {
log.error("EmailHandler#getAccount fail!{}", Throwables.getStackTraceAsString(e));

@ -1,7 +1,7 @@
package com.java3y.austin.handler.pending;
import com.dtp.core.DtpRegistry;
import com.dtp.core.thread.DtpExecutor;
import org.dromara.dynamictp.core.DtpRegistry;
import org.dromara.dynamictp.core.executor.DtpExecutor;
import com.java3y.austin.handler.config.HandlerThreadPoolConfig;
import com.java3y.austin.handler.utils.GroupIdMappingUtils;
import com.java3y.austin.support.utils.ThreadPoolUtils;
@ -9,9 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
@ -52,7 +50,7 @@ public class TaskPendingHolder {
* @return
*/
public ExecutorService route(String groupId) {
return DtpRegistry.getExecutor(HandlerThreadPoolConfig.PRE_FIX + groupId);
return (ExecutorService) DtpRegistry.getExecutor(HandlerThreadPoolConfig.PRE_FIX + groupId);
}

@ -5,60 +5,69 @@ import com.java3y.austin.handler.utils.GroupIdMappingUtils;
import com.java3y.austin.support.constans.MessageQueuePipeline;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.common.header.Header;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.KafkaListenerAnnotationBeanPostProcessor;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
/**
*
* Kafka
* Kafka Bean Receiver
*
* @author 3y
* @date 2021/12/4
*/
@Service
@Configuration
@ConditionalOnProperty(name = "austin.mq.pipeline", havingValue = MessageQueuePipeline.KAFKA)
@Slf4j
public class ReceiverStart {
public class KafkaConsumerConfig implements SmartInitializingSingleton {
/**
* receiver
* receiver
*/
private static final String RECEIVER_METHOD_NAME = "Receiver.consumer";
/**
* groupId
* groupId
*/
private static final List<String> GROUP_IDS = GroupIdMappingUtils.getAllGroupIds();
/**
* (groupIds)
* ( groupIds )使 AtomicInteger
*/
private static Integer index = 0;
@Autowired
private ApplicationContext context;
@Autowired
private ConsumerFactory consumerFactory;
private static final AtomicInteger index = new AtomicInteger(0);
private final ApplicationContext applicationContext;
public KafkaConsumerConfig(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
/**
* Receiverconsumer @KafkaListenergroupId
* Receiver consumer @KafkaListener groupId
*
* @return AnnotationEnhancer
*/
@Bean
public static KafkaListenerAnnotationBeanPostProcessor.AnnotationEnhancer groupIdEnhancer() {
return (attrs, element) -> {
if (element instanceof Method) {
String name = ((Method) element).getDeclaringClass().getSimpleName() + StrPool.DOT + ((Method) element).getName();
String name = ((Method) element).getDeclaringClass().getSimpleName()
+ StrPool.DOT + ((Method) element).getName();
if (RECEIVER_METHOD_NAME.equals(name)) {
attrs.put("groupId", GROUP_IDS.get(index++));
int currentIndex = index.getAndIncrement();
if (currentIndex < GROUP_IDS.size()) {
attrs.put("groupId", GROUP_IDS.get(currentIndex));
}
}
}
return attrs;
@ -66,25 +75,22 @@ public class ReceiverStart {
}
/**
* Receiver
*/
@PostConstruct
public void init() {
for (int i = 0; i < GROUP_IDS.size(); i++) {
context.getBean(Receiver.class);
}
}
/**
* tag
* producer tagheader
*
* @return true
* tag
* producer tag header
*
* @param consumerFactory Kafka
* @param tagIdKey tagId key
* @param tagIdValue tagId value
* @return
*/
@Bean
public ConcurrentKafkaListenerContainerFactory filterContainerFactory(@Value("${austin.business.tagId.key}") String tagIdKey,
@Value("${austin.business.tagId.value}") String tagIdValue) {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
public ConcurrentKafkaListenerContainerFactory<String, String> filterContainerFactory(
ConsumerFactory<String, String> consumerFactory,
@Value("${austin.business.tagId.key}") String tagIdKey,
@Value("${austin.business.tagId.value}") String tagIdValue) {
ConcurrentKafkaListenerContainerFactory<String, String> factory =
new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory);
factory.setAckDiscarded(true);
@ -101,4 +107,16 @@ public class ReceiverStart {
});
return factory;
}
/**
* Bean Receiver
*/
@Override
public void afterSingletonsInstantiated() {
log.info("开始初始化 Receiver 实例,需要创建 {} 个实例", GROUP_IDS.size());
for (int i = 0; i < GROUP_IDS.size(); i++) {
applicationContext.getBean(Receiver.class);
}
log.info("Receiver 实例初始化完成");
}
}

@ -94,10 +94,9 @@
</dependency>
<dependency>
<groupId>io.github.lyh200</groupId>
<groupId>org.dromara.dynamictp</groupId>
<artifactId>dynamic-tp-spring-boot-starter-apollo</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>

@ -2,10 +2,10 @@ package com.java3y.austin.support.domain;
import lombok.*;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
/**
* @author 3y

@ -7,10 +7,10 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import java.io.Serializable;
@Data

@ -5,10 +5,10 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Data
@Builder

@ -1,8 +1,9 @@
package com.java3y.austin.support.utils;
import com.dtp.core.DtpRegistry;
import com.dtp.core.thread.DtpExecutor;
import org.dromara.dynamictp.core.DtpRegistry;
import org.dromara.dynamictp.core.executor.DtpExecutor;
import com.java3y.austin.support.config.ThreadPoolExecutorShutdownDefinition;
import org.dromara.dynamictp.core.support.ExecutorWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@ -23,7 +24,7 @@ public class ThreadPoolUtils {
* 2. 线 Spring
*/
public void register(DtpExecutor dtpExecutor) {
DtpRegistry.register(dtpExecutor, SOURCE_NAME);
DtpRegistry.registerExecutor(new ExecutorWrapper(dtpExecutor), SOURCE_NAME);
shutdownDefinition.registryExecutor(dtpExecutor);
}
}

@ -48,9 +48,11 @@
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<!-- 使用 springdoc 适配 Spring Boot 3.x 的 OpenAPI/Swagger UI -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>

@ -17,8 +17,8 @@ import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;

@ -1,34 +1,10 @@
package com.java3y.austin.web.config;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.google.common.collect.Lists;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import java.util.List;
/**
* @author kl
* @version 1.0.0
* @description
* @date 2023/2/23 10:40
* Web 使 Spring Boot Jackson
*/
@Configuration
public class CommonConfiguration {
/**
* FastJson json
*
* @return
*/
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
List<MediaType> supportedMediaTypes = Lists.newArrayList();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
fastConverter.setSupportedMediaTypes(supportedMediaTypes);
return new HttpMessageConverters(fastConverter);
}
}

@ -1,56 +1,11 @@
package com.java3y.austin.web.config;
import io.swagger.annotations.ApiModel;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import org.springframework.context.annotation.Configuration;
/**
* swagger
*
* @author 3y
* OpenAPI 使 springdoc Docket
* 访/swagger-ui/index.html /v3/api-docs
*/
@Component
@EnableOpenApi
@ApiModel
@Configuration
public class SwaggerConfiguration {
/**
* C
* <p>
* http://localhost:8080/swagger-ui/index.html
*
* @return
*/
@Bean
public Docket webApiDoc() {
return new Docket(DocumentationType.OAS_30)
.groupName("用户端接口文档")
.pathMapping("/")
//定义是否开启Swaggerfalse是关闭可以通过变量去控制线上关闭
.enable(true)
//配置文档的元信息
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.java3y.austin.web.controller"))
//正则匹配请求路径,并分配到当前项目组
//.paths(PathSelectors.ant("/api/**"))
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("austin平台")
.description("消息推送接口接口文档")
.contact(new Contact("3y", "http://gitee.com/zhongfucheng/austin", "403686131@qq.com"))
.version("v1.0")
.build();
}
}

@ -18,8 +18,8 @@ import com.java3y.austin.web.annotation.AustinResult;
import com.java3y.austin.web.exception.CommonException;
import com.java3y.austin.web.utils.Convert4Amis;
import com.java3y.austin.web.vo.amis.CommonAmisVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@ -40,14 +40,14 @@ import java.util.Objects;
@AustinAspect
@RestController
@RequestMapping("/alipayMiniProgram")
@Api("支付宝小程序")
@Tag(name = "支付宝小程序")
public class AlipayMiniProgramController {
@Autowired
private AccountUtils accountUtils;
@GetMapping("/template/list")
@ApiOperation("/根据账号Id获取模板列表")
@Operation(summary = "/根据账号Id获取模板列表")
@AustinResult
public List<CommonAmisVo> queryList(Integer id) {
try {
@ -95,7 +95,7 @@ public class AlipayMiniProgramController {
* @return
*/
@PostMapping("/detailTemplate")
@ApiOperation("/根据账号Id和模板ID获取模板列表")
@Operation(summary = "/根据账号Id和模板ID获取模板列表")
@AustinResult
public CommonAmisVo queryDetailList(Integer id, String alipayTemplateId) {
if (Objects.isNull(id) || Objects.isNull(alipayTemplateId)) {
@ -144,7 +144,7 @@ public class AlipayMiniProgramController {
* @return
*/
@GetMapping("/sync/openid")
@ApiOperation("登录凭证校验")
@Operation(summary = "登录凭证校验")
public String syncOpenId(String code, String appId, String secret) {
String url = SendChanelUrlConstant.WE_CHAT_MINI_PROGRAM_OPENID_SYNC
.replace("<APPID>", appId).replace("<CODE>", code).replace("<SECRET>", secret);

@ -13,8 +13,8 @@ import com.java3y.austin.web.service.ChannelAccountService;
import com.java3y.austin.web.utils.Convert4Amis;
import com.java3y.austin.web.utils.LoginUtils;
import com.java3y.austin.web.vo.amis.CommonAmisVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@ -33,7 +33,7 @@ import java.util.stream.Collectors;
@AustinResult
@RestController
@RequestMapping("/account")
@Api("渠道账号管理接口")
@Tag(name = "渠道账号管理接口")
public class ChannelAccountController {
@Autowired
@ -47,7 +47,7 @@ public class ChannelAccountController {
* Id
*/
@PostMapping("/save")
@ApiOperation("/保存数据")
@Operation(summary = "/保存数据")
public ChannelAccount saveOrUpdate(@RequestBody ChannelAccount channelAccount) {
if (loginUtils.needLogin() && CharSequenceUtil.isBlank(channelAccount.getCreator())) {
throw new CommonException(RespStatusEnum.NO_LOGIN.getCode(), RespStatusEnum.NO_LOGIN.getMsg());
@ -61,7 +61,7 @@ public class ChannelAccountController {
*
*/
@GetMapping("/queryByChannelType")
@ApiOperation("/根据渠道标识查询相关的记录")
@Operation(summary = "/根据渠道标识查询相关的记录")
public List<CommonAmisVo> query(Integer channelType, String creator) {
if (loginUtils.needLogin() && CharSequenceUtil.isBlank(creator)) {
throw new CommonException(RespStatusEnum.NO_LOGIN.getCode(), RespStatusEnum.NO_LOGIN.getMsg());
@ -76,7 +76,7 @@ public class ChannelAccountController {
*
*/
@GetMapping("/list")
@ApiOperation("/渠道账号列表信息")
@Operation(summary = "/渠道账号列表信息")
public List<ChannelAccount> list(String creator) {
if (loginUtils.needLogin() && CharSequenceUtil.isBlank(creator)) {
throw new CommonException(RespStatusEnum.NO_LOGIN.getCode(), RespStatusEnum.NO_LOGIN.getMsg());
@ -92,7 +92,7 @@ public class ChannelAccountController {
* id
*/
@DeleteMapping("delete/{id}")
@ApiOperation("/根据Ids删除")
@Operation(summary = "/根据Ids删除")
public void deleteByIds(@PathVariable("id") String id) {
if (CharSequenceUtil.isNotBlank(id)) {
List<Long> idList = Arrays.stream(id.split(StrPool.COMMA)).map(Long::valueOf).collect(Collectors.toList());

@ -8,8 +8,8 @@ import com.java3y.austin.web.vo.DataParam;
import com.java3y.austin.web.vo.amis.EchartsVo;
import com.java3y.austin.web.vo.amis.SmsTimeLineVo;
import com.java3y.austin.web.vo.amis.UserTimeLineVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.util.Lists;
import org.springframework.beans.factory.annotation.Autowired;
@ -31,13 +31,13 @@ import java.util.Objects;
@AustinResult
@RestController
@RequestMapping("/trace")
@Api("获取数据接口(全链路追踪)")
@Tag(name = "获取数据接口(全链路追踪)")
public class DataController {
@Autowired
private DataService dataService;
@PostMapping("/message")
@ApiOperation("/获取【72小时】发送消息的全链路数据")
@Operation(summary = "/获取【72小时】发送消息的全链路数据")
public UserTimeLineVo getMessageData(@RequestBody DataParam dataParam) {
if (Objects.isNull(dataParam) || CharSequenceUtil.isBlank(dataParam.getMessageId())) {
return UserTimeLineVo.builder().items(new ArrayList<>()).build();
@ -46,7 +46,7 @@ public class DataController {
}
@PostMapping("/user")
@ApiOperation("/获取【当天】用户接收消息的全链路数据")
@Operation(summary = "/获取【当天】用户接收消息的全链路数据")
public UserTimeLineVo getUserData(@RequestBody DataParam dataParam) {
if (Objects.isNull(dataParam) || CharSequenceUtil.isBlank(dataParam.getReceiver())) {
return UserTimeLineVo.builder().items(new ArrayList<>()).build();
@ -55,7 +55,7 @@ public class DataController {
}
@PostMapping("/messageTemplate")
@ApiOperation("/获取消息模板全链路数据")
@Operation(summary = "/获取消息模板全链路数据")
public EchartsVo getMessageTemplateData(@RequestBody DataParam dataParam) {
EchartsVo echartsVo = EchartsVo.builder().build();
if (CharSequenceUtil.isNotBlank(dataParam.getBusinessId())) {
@ -65,7 +65,7 @@ public class DataController {
}
@PostMapping("/sms")
@ApiOperation("/获取短信下发数据")
@Operation(summary = "/获取短信下发数据")
public SmsTimeLineVo getSmsData(@RequestBody DataParam dataParam) {
if (Objects.isNull(dataParam) || Objects.isNull(dataParam.getDateTime()) || CharSequenceUtil.isBlank(dataParam.getReceiver())) {
return SmsTimeLineVo.builder().items(Lists.newArrayList()).build();

@ -1,8 +1,8 @@
package com.java3y.austin.web.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@ -14,10 +14,10 @@ import org.springframework.web.bind.annotation.RestController;
*/
@Slf4j
@RestController
@Api("健康检测")
@Tag(name = "健康检测")
public class HealthController {
@GetMapping("/")
@ApiOperation("/健康检测")
@Operation(summary = "/健康检测")
public String health() {
return "success";
}

@ -5,8 +5,8 @@ import com.java3y.austin.common.enums.ChannelType;
import com.java3y.austin.common.vo.BasicResultVO;
import com.java3y.austin.web.annotation.AustinAspect;
import com.java3y.austin.web.service.MaterialService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
@ -25,7 +25,7 @@ import org.springframework.web.multipart.MultipartFile;
@AustinAspect
@RestController
@RequestMapping("/material")
@Api("素材管理接口")
@Tag(name = "素材管理接口")
public class MaterialController {
@Autowired
@ -42,7 +42,7 @@ public class MaterialController {
* @return
*/
@PostMapping("/upload")
@ApiOperation("/素材上传接口")
@Operation(summary = "/素材上传接口")
public BasicResultVO uploadMaterial(@RequestParam("file") MultipartFile file, String sendAccount, Integer sendChannel, String fileType) {
if (ChannelType.DING_DING_WORK_NOTICE.getCode().equals(sendChannel)) {
return materialService.dingDingMaterialUpload(file, sendAccount, fileType);

@ -25,8 +25,8 @@ import com.java3y.austin.web.utils.LoginUtils;
import com.java3y.austin.web.vo.MessageTemplateParam;
import com.java3y.austin.web.vo.MessageTemplateVo;
import com.java3y.austin.web.vo.amis.CommonAmisVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@ -53,7 +53,7 @@ import java.util.stream.Collectors;
@AustinResult
@RestController
@RequestMapping("/messageTemplate")
@Api("发送消息")
@Tag(name = "发送消息")
public class MessageTemplateController {
@Autowired
@ -76,7 +76,7 @@ public class MessageTemplateController {
* Id
*/
@PostMapping("/save")
@ApiOperation("/保存数据")
@Operation(summary = "/保存数据")
public MessageTemplate saveOrUpdate(@RequestBody MessageTemplate messageTemplate) {
if (loginUtils.needLogin() && CharSequenceUtil.isBlank(messageTemplate.getCreator())) {
throw new CommonException(RespStatusEnum.NO_LOGIN.getCode(), RespStatusEnum.NO_LOGIN.getMsg());
@ -88,7 +88,7 @@ public class MessageTemplateController {
*
*/
@GetMapping("/list")
@ApiOperation("/列表页")
@Operation(summary = "/列表页")
public MessageTemplateVo queryList(@Validated MessageTemplateParam messageTemplateParam) {
if (loginUtils.needLogin() && CharSequenceUtil.isBlank(messageTemplateParam.getCreator())) {
throw new CommonException(RespStatusEnum.NO_LOGIN.getCode(), RespStatusEnum.NO_LOGIN.getMsg());
@ -102,7 +102,7 @@ public class MessageTemplateController {
* Id
*/
@GetMapping("query/{id}")
@ApiOperation("/根据Id查找")
@Operation(summary = "/根据Id查找")
public Map<String, Object> queryById(@PathVariable("id") Long id) {
return Convert4Amis.flatSingleMap(messageTemplateService.queryById(id));
}
@ -111,7 +111,7 @@ public class MessageTemplateController {
* Id
*/
@PostMapping("copy/{id}")
@ApiOperation("/根据Id复制")
@Operation(summary = "/根据Id复制")
public void copyById(@PathVariable("id") Long id) {
messageTemplateService.copy(id);
}
@ -122,7 +122,7 @@ public class MessageTemplateController {
* id
*/
@DeleteMapping("delete/{id}")
@ApiOperation("/根据Ids删除")
@Operation(summary = "/根据Ids删除")
public void deleteByIds(@PathVariable("id") String id) {
if (CharSequenceUtil.isNotBlank(id)) {
List<Long> idList = Arrays.stream(id.split(StrPool.COMMA)).map(Long::valueOf).collect(Collectors.toList());
@ -135,7 +135,7 @@ public class MessageTemplateController {
*
*/
@PostMapping("test")
@ApiOperation("/测试发送接口")
@Operation(summary = "/测试发送接口")
public SendResponse test(@RequestBody MessageTemplateParam messageTemplateParam) {
Map<String, String> variables = JSON.parseObject(messageTemplateParam.getMsgContent(), new TypeReference<Map<String, String>>() {});
@ -152,7 +152,7 @@ public class MessageTemplateController {
* Amis
*/
@PostMapping("test/content")
@ApiOperation("/测试发送接口")
@Operation(summary = "/测试发送接口")
public CommonAmisVo test(Long id) {
MessageTemplate messageTemplate = messageTemplateService.queryById(id);
return Convert4Amis.getTestContent(messageTemplate.getMsgContent());
@ -163,7 +163,7 @@ public class MessageTemplateController {
* id
*/
@PostMapping("recall/{id}")
@ApiOperation("/撤回消息接口")
@Operation(summary = "/撤回消息接口")
public SendResponse recall(@PathVariable("id") String id) {
SendRequest sendRequest = SendRequest.builder().code(BusinessCode.RECALL.getCode()).messageTemplateId(Long.valueOf(id)).build();
SendResponse response = recallService.recall(sendRequest);
@ -178,7 +178,7 @@ public class MessageTemplateController {
*
*/
@PostMapping("start/{id}")
@ApiOperation("/启动模板的定时任务")
@Operation(summary = "/启动模板的定时任务")
public BasicResultVO start(@RequestBody @PathVariable("id") Long id) {
return messageTemplateService.startCronTask(id);
}
@ -187,7 +187,7 @@ public class MessageTemplateController {
*
*/
@PostMapping("stop/{id}")
@ApiOperation("/暂停模板的定时任务")
@Operation(summary = "/暂停模板的定时任务")
public BasicResultVO stop(@RequestBody @PathVariable("id") Long id) {
return messageTemplateService.stopCronTask(id);
}
@ -196,7 +196,7 @@ public class MessageTemplateController {
*
*/
@PostMapping("upload")
@ApiOperation("/上传人群文件")
@Operation(summary = "/上传人群文件")
public Map<Object, Object> upload(@RequestParam("file") MultipartFile file) {
String filePath = dataPath + IdUtil.fastSimpleUUID() + file.getOriginalFilename();
try {

@ -12,8 +12,8 @@ import com.java3y.austin.web.annotation.AustinResult;
import com.java3y.austin.web.exception.CommonException;
import com.java3y.austin.web.utils.Convert4Amis;
import com.java3y.austin.web.vo.amis.CommonAmisVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo;
import org.springframework.beans.factory.annotation.Autowired;
@ -35,14 +35,14 @@ import java.util.Objects;
@AustinAspect
@RestController
@RequestMapping("/miniProgram")
@Api("微信服务号")
@Tag(name = "微信服务号")
public class MiniProgramController {
@Autowired
private AccountUtils accountUtils;
@GetMapping("/template/list")
@ApiOperation("/根据账号Id获取模板列表")
@Operation(summary = "/根据账号Id获取模板列表")
@AustinResult
public List<CommonAmisVo> queryList(Integer id) {
try {
@ -67,7 +67,7 @@ public class MiniProgramController {
* @return
*/
@PostMapping("/detailTemplate")
@ApiOperation("/根据账号Id和模板ID获取模板列表")
@Operation(summary = "/根据账号Id和模板ID获取模板列表")
@AustinResult
public CommonAmisVo queryDetailList(Integer id, String wxTemplateId) {
if (Objects.isNull(id) || Objects.isNull(wxTemplateId)) {
@ -93,7 +93,7 @@ public class MiniProgramController {
* @return
*/
@GetMapping("/sync/openid")
@ApiOperation("登录凭证校验")
@Operation(summary = "登录凭证校验")
public String syncOpenId(String code, String appId, String secret) {
String url = SendChanelUrlConstant.WE_CHAT_MINI_PROGRAM_OPENID_SYNC
.replace("<APPID>", appId).replace("<CODE>", code).replace("<SECRET>", secret);

@ -19,8 +19,8 @@ import com.java3y.austin.web.exception.CommonException;
import com.java3y.austin.web.utils.Convert4Amis;
import com.java3y.austin.web.utils.LoginUtils;
import com.java3y.austin.web.vo.amis.CommonAmisVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
@ -35,7 +35,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequest;
import java.util.*;
/**
@ -47,7 +47,7 @@ import java.util.*;
@AustinAspect
@RequestMapping("/officialAccount")
@RestController
@Api("微信服务号")
@Tag(name = "微信服务号")
public class OfficialAccountController {
@Autowired
@ -65,7 +65,7 @@ public class OfficialAccountController {
* @return
*/
@GetMapping("/template/list")
@ApiOperation("/根据账号Id获取模板列表")
@Operation(summary = "/根据账号Id获取模板列表")
@AustinResult
public List<CommonAmisVo> queryList(Integer id) {
try {
@ -91,7 +91,7 @@ public class OfficialAccountController {
* @return
*/
@PostMapping("/detailTemplate")
@ApiOperation("/根据账号Id和模板ID获取模板列表")
@Operation(summary = "/根据账号Id和模板ID获取模板列表")
@AustinResult
public CommonAmisVo queryDetailList(Integer id, String wxTemplateId) {
if (Objects.isNull(id) || Objects.isNull(wxTemplateId)) {
@ -117,7 +117,7 @@ public class OfficialAccountController {
* @return
*/
@RequestMapping(value = "/receipt", produces = {CommonConstant.CONTENT_TYPE_XML})
@ApiOperation("/接收微信的事件消息")
@Operation(summary = "/接收微信的事件消息")
public String receiptMessage(HttpServletRequest request) {
try {
WeChatLoginConfig configService = loginUtils.getLoginConfig();
@ -168,7 +168,7 @@ public class OfficialAccountController {
* @return
*/
@PostMapping("/qrCode")
@ApiOperation("/生成 服务号 二维码")
@Operation(summary = "/生成 服务号 二维码")
@AustinResult
public CommonAmisVo getQrCode() {
try {
@ -193,7 +193,7 @@ public class OfficialAccountController {
* @return
*/
@RequestMapping("/check/login")
@ApiOperation("/检查是否已经登录")
@Operation(summary = "/检查是否已经登录")
@AustinResult
public WxMpUser checkLogin(String sceneId) {
String userInfo = redisTemplate.opsForValue().get(sceneId);
@ -213,7 +213,7 @@ public class OfficialAccountController {
* @return
*/
@RequestMapping("/delete/test/user")
@ApiOperation("/删除测试号的测试用户")
@Operation(summary = "/删除测试号的测试用户")
@AustinResult
public void deleteTestUser(HttpServletRequest request) {
try {

@ -5,8 +5,8 @@ import com.java3y.austin.common.enums.ChannelType;
import com.java3y.austin.cron.handler.RefreshDingDingAccessTokenHandler;
import com.java3y.austin.cron.handler.RefreshGeTuiAccessTokenHandler;
import com.java3y.austin.web.annotation.AustinAspect;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RestController;
*/
@AustinAspect
@Api(tags = {"手动刷新token的接口"})
@Tag(name = "手动刷新token的接口")
@RestController
public class RefreshTokenController {
@ -33,7 +33,7 @@ public class RefreshTokenController {
* @param channelType
* @return
*/
@ApiOperation(value = "手动刷新token", notes = "钉钉/个推 token刷新")
@Operation(summary = "手动刷新token", description = "钉钉/个推 token刷新")
@GetMapping("/refresh")
public String refresh(Integer channelType) {
if (ChannelType.PUSH.getCode().equals(channelType)) {

@ -7,8 +7,8 @@ import com.java3y.austin.service.api.domain.SendResponse;
import com.java3y.austin.service.api.service.RecallService;
import com.java3y.austin.service.api.service.SendService;
import com.java3y.austin.web.annotation.AustinAspect;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.RestController;
* @author
*/
@Api(tags = {"发送消息"})
@Tag(name = "发送消息")
@RestController
@AustinAspect
public class SendController {
@ -36,7 +36,7 @@ public class SendController {
* @param sendRequest
* @return
*/
@ApiOperation(value = "下发接口", notes = "多渠道多类型下发消息,目前支持邮件和短信,类型支持:验证码、通知类、营销类。")
@Operation(summary = "下发接口", description = "多渠道多类型下发消息,目前支持邮件和短信,类型支持:验证码、通知类、营销类。")
@PostMapping("/send")
public SendResponse send(@RequestBody SendRequest sendRequest) {
return sendService.send(sendRequest);
@ -48,7 +48,7 @@ public class SendController {
* @param batchSendRequest
* @return
*/
@ApiOperation(value = "batch下发接口", notes = "多渠道多类型下发消息,目前支持邮件和短信,类型支持:验证码、通知类、营销类。")
@Operation(summary = "batch下发接口", description = "多渠道多类型下发消息,目前支持邮件和短信,类型支持:验证码、通知类、营销类。")
@PostMapping("/batchSend")
public SendResponse batchSend(@RequestBody BatchSendRequest batchSendRequest) {
return sendService.batchSend(batchSendRequest);
@ -60,7 +60,7 @@ public class SendController {
* @param sendRequest
* @return
*/
@ApiOperation(value = "撤回消息接口", notes = "优先根据messageId撤回消息如果messageId不存在则根据模板id撤回")
@Operation(summary = "撤回消息接口", description = "优先根据messageId撤回消息如果messageId不存在则根据模板id撤回")
@PostMapping("/recall")
public SendResponse recall(@RequestBody SendRequest sendRequest) {
return recallService.recall(sendRequest);

@ -23,7 +23,7 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import javax.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@ -5,7 +5,7 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import jakarta.validation.constraints.NotNull;
/**

@ -3,11 +3,11 @@ spring.application.name=austin
########################################## database start ##########################################
# TODO required!
# notice:mysql version 5.7x !!!
# notice:mysql version 8.x !!!
spring.datasource.url=jdbc:mysql://${austin.database.ip:austin-mysql}:${austin.database.port:3306}/austin?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull
spring.datasource.username=${austin.database.username:root}
spring.datasource.password=${austin.database.password:root123_A}
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
@ -22,9 +22,10 @@ spring.datasource.hikari.validation-timeout=1000
########################################## redis start ##########################################
# TODO required!
spring.redis.host=${austin.redis.ip:austin-redis}
spring.redis.port=${austin.redis.port:6379}
spring.redis.password=${austin.redis.password:austin}
spring.data.redis.host=${austin.redis.ip:austin-redis}
spring.data.redis.port=${austin.redis.port:6379}
spring.data.redis.password=${austin.redis.password:austin}
spring.data.redis.connect-timeout=20s
########################################## redis end ##########################################
@ -123,10 +124,8 @@ ok.http.write-timeout=30
########################################## monitor start ##########################################
management.endpoint.health.show-details=always
management.endpoint.metrics.enabled=true
management.endpoint.prometheus.enabled=true
management.endpoints.web.exposure.include=*
management.metrics.export.prometheus.enabled=true
management.prometheus.metrics.export.enabled=true
management.health.rabbit.enabled=false
########################################## monitor end ##########################################
@ -134,3 +133,4 @@ management.health.rabbit.enabled=false
server.shutdown=graceful
########################################## system end ##########################################
spring.main.allow-circular-references=true

@ -30,14 +30,14 @@
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>${log.path}/logs/austin-info-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1000MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxFileSize>1000MB</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>3</maxHistory>
<!-- 总文件大小限制 -->
<totalSizeCap>100GB</totalSizeCap>
</rollingPolicy>
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
@ -57,13 +57,13 @@
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/logs/austin-error-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1000MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxFileSize>1000MB</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>3</maxHistory>
<!-- 总文件大小限制 -->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<!-- 此日志文件只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">

@ -19,7 +19,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
<version>3.5.7</version>
<relativePath/>
</parent>
@ -35,23 +35,22 @@
<revision>0.0.1-SNAPSHOT</revision>
<!--构建配置-->
<java.version>1.8</java.version>
<target.java.version>1.8</target.java.version>
<java.version>25</java.version>
<target.java.version>25</target.java.version>
<maven.compiler.source>${target.java.version}</maven.compiler.source>
<maven.compiler.target>${target.java.version}</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--依赖库版本-->
<mysql-connector-java.version>5.1.35</mysql-connector-java.version>
<mysql-connector-java.version>8.0.33</mysql-connector-java.version>
<hutool-all.version>5.7.15</hutool-all.version>
<guava.version>31.0.1-jre</guava.version>
<guava.version>33.5.0-jre</guava.version>
<okhttp.version>4.9.2</okhttp.version>
<fastjson2.version>2.0.60</fastjson2.version>
<tencentcloud-sdk-java.version>3.1.510</tencentcloud-sdk-java.version>
<nacos-config-spring-boot-starter.version>0.2.12</nacos-config-spring-boot-starter.version>
<apollo-client.version>2.1.0</apollo-client.version>
<log-record-starter.version>1.0.4.1</log-record-starter.version>
<javax.mail.version>1.6.2</javax.mail.version>
<springfox-boot-starter.version>3.0.0</springfox-boot-starter.version>
<logback-gelf.version>3.0.0</logback-gelf.version>
<xxl-job-core.version>2.3.0</xxl-job-core.version>
@ -61,7 +60,7 @@
<flink-table-api-java-bridge.version>1.16.0</flink-table-api-java-bridge.version>
<hive-exec.version>2.3.4</hive-exec.version>
<weixin-java>4.5.3.B</weixin-java>
<dynamic-tp-spring-boot-starter-apollo.version>1.0.2</dynamic-tp-spring-boot-starter-apollo.version>
<dynamic-tp-spring-boot-starter-apollo.version>1.2.2-x</dynamic-tp-spring-boot-starter-apollo.version>
<alipay-sdk-java.version>4.39.19.ALL</alipay-sdk-java.version>
<alibaba-dingtalk-service-sdk.version>2.0.0</alibaba-dingtalk-service-sdk.version>
<rocketmq-spring-boot-starter.version>2.2.2</rocketmq-spring-boot-starter.version>
@ -187,13 +186,6 @@
<version>${log-record-starter.version}</version>
</dependency>
<!--邮件发送-->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>${javax.mail.version}</version>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
@ -279,7 +271,7 @@
<!--动态线程池引入-->
<dependency>
<groupId>io.github.lyh200</groupId>
<groupId>org.dromara.dynamictp</groupId>
<artifactId>dynamic-tp-spring-boot-starter-apollo</artifactId>
<version>${dynamic-tp-spring-boot-starter-apollo.version}</version>
</dependency>

Loading…
Cancel
Save