dromara / dynamic-tp

🔥🔥🔥轻量级动态线程池,内置监控告警功能,集成三方中间件线程池管理,基于主流配置中心(已支持Nacos、Apollo,Zookeeper、Consul、Etcd,可通过SPI自定义实现)。Lightweight dynamic threadpool, with monitoring and alarming functions, base on popular config centers (already support Nacos、Apollo、Zookeeper、Consul, can be customized through SPI).
https://dynamictp.cn
Apache License 2.0
3.57k stars 729 forks source link

自定义 RejectedExecutionHandler 启动问题 #432

Open dbige opened 5 days ago

dbige commented 5 days ago

版本

     <dependency>
            <groupId>org.dromara.dynamictp</groupId>
            <artifactId>dynamic-tp-spring-boot-starter-common</artifactId>
            <version>1.1.7</version>
        </dependency>

sprinboot 2.3.4.RELEASE jdk8

问题

如果我使用自定义的拒绝策略,我将无法正常启动

@Slf4j
@Component
public class CustomRejectPolicy implements RejectedExecutionHandler {

    @SneakyThrows
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        // 这里可以根据需要抛出自定义异常
        log.error(message);
        throw new CommonException(566, "当前访问量过大!");
    }
}
    @Bean
    public DtpExecutor eagerDtpExecutor() {
        return ThreadPoolBuilder.newBuilder()
                .threadPoolName("TEST_POOL-%d")
                .threadFactory("TEST_POOL")
                .corePoolSize(2)
                .maximumPoolSize(8)
                .queueCapacity(100)
                .rejectedExecutionHandler(rejectPolicy)
                .eager(true)
                .buildDynamic();
    }

在 使用懒加载获取该自定义拒绝策略org.dromara.dynamictp.common.util.ExtensionServiceLoader.load(Class clazz)方法中 ServiceLoader.load(clazz); 将无法获取到我自定义的 CustomRejectPolicy ,我看到 ThreadPoolBuilder.newBuilder() 方法提供了rejectedExecutionHandler(RejectedExecutionHandler handler) 的方法.我改怎么做呢? CustomRejectPolicy 已经交由 spring 使用 @Resource 注解获取

yanhom1314 commented 4 days ago

没有配置spi?

dbige commented 4 days ago

感谢您的回复,我没有理解你的意思? spi 配置是做什么配置呢? 我没有使用配置中心的动态线程池,而是使用框架案例中@bean方式生成的线程池,

ThreadPoolBuilder.newBuilder()
     .rejectedExecutionHandler(rejectPolicy)
   剩余配置省略

然后该配置与 dtpLifecycle 类自动配置相关有冲突报错截取如下

org.springframework.context.ApplicationContextException: Failed to start bean 'dtpLifecycle'; nested exception is org.dromara.dynamictp.common.ex.DtpException: Cannot find specified rejectedHandler CustomRejectPolicy
    at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:185)
    at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:53)
    at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:360)
    at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:158)
    at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:122)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:895)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:554)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
    at com.pec.retail.mdc.MdcServiceApplication.main(MdcServiceApplication.java:23)
Caused by: org.dromara.dynamictp.common.ex.DtpException: Cannot find specified rejectedHandler CustomRejectPolicy

从报错上看应该是框架没法找到我自定义的拒绝策略CustomRejectPolicy ,上文有述说过不在赘述. 我太理解我还要做特殊配置,调用api去修改?还是我遗漏了什么? 我没在官网的举例中找到自定义拒绝策略的相关配置,如果有的话能否提供下举例截图,或者相关路径,感谢