spring 随笔 async 0-先有个用例

0. 我说网上spring.async相关的博文为啥比较少,原来是简单的缘故

先放代码,就一些简单、常见的异步配置的代码而已…

1. 自定义的异步配置的支持类

public class AsyncSupport {
    protected static final String PREFIX_ALIAS_THREAD_NAME = "ANGEL-EXEC-";

    protected static final String SUFFIX_ALIAS_THREAD_NAME = "-";

    protected static final String DEFAULT_EXECUTOR_QUALIFIER = "angelDefaultExecutor";

    protected AsyncSupport() {
    }

    protected Executor buildAngelExecutor(ExecutorProperties properties) {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(properties.getCorePoolSize());
        executor.setMaxPoolSize(properties.getMaxPoolSize());
        executor.setQueueCapacity(properties.getQueueCapacity());
        executor.setKeepAliveSeconds(properties.getKeepAliveSeconds());
        executor.setThreadNamePrefix(StringUtils.join(
                PREFIX_ALIAS_THREAD_NAME,
                properties.getAlias(),
                SUFFIX_ALIAS_THREAD_NAME));
        return executor;
    }

    protected ExecutorProperties defaultExecutorProperties() {
        return ExecutorProperties.builder()
                .alias(DEFAULT_EXECUTOR_QUALIFIER)
                .corePoolSize(8)
                .maxPoolSize(16)
                .queueCapacity(32)
                .keepAliveSeconds(64)
                .build();
    }
}

2. 配置类也很简单,通过spring.async.configurer的方式参与到其工厂类的初始化中去

/**
 * @author weng
 * @since 2023/3/30
 * <p>
 * https://dandelioncloud.cn/article/details/1407362417307082753/
 * https://blog.csdn.net/ludadan/article/details/116932178
 */

@Configuration
// 默认还是走 application.yml; 但还是要配置,因为不配的话,绝对不走 application-async.yml
@PropertySource(value = "classpath:application-async.yml", factory = YmlPropSrcFactory.class)
@Import(AsyncProperties.class)
@EnableAsync
@Slf4j
//@AutoConfigureAfter autoConfiguration才会生效(spring.factories)
public class AsyncConfig extends AsyncSupport implements AsyncConfigurer {

    @Autowired
    private MetaProperties metaProperties;

    @Autowired
    private Map<String, ExecutorProperties> executorProperties;

    @Bean(DEFAULT_EXECUTOR_QUALIFIER)
    @Primary
    public Executor angelDefaultExecutor() {
        ExecutorProperties defaultExecutorProperties = this.defaultExecutorProperties();
        if (MapUtils.isNotEmpty(executorProperties)) {
            ExecutorProperties properties = this.executorProperties.get(DEFAULT_EXECUTOR_QUALIFIER);
            if (Objects.nonNull(executorProperties)) {
                defaultExecutorProperties = properties;
            }
        }
        return this.buildAngelExecutor(defaultExecutorProperties);
    }

    @Override
    public Executor getAsyncExecutor() {
        return this.angelDefaultExecutor();
    }

    // 处理 异步任务 中的异常
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return (ex, method, params) -> {
            log.error("ex.msg:[{}], method:[{}], params:[{}]",
                    ex.getMessage(), method.getName(), Jsons.NO_OP.stringify(params));
        };
    }
}

3. properties也放一下吧

/**
 * @author weng
 * @since 2023/3/30
 * <p>
 * https://blog.csdn.net/inexaustible/article/details/126886130
 * https://blog.csdn.net/ludadan/article/details/116932178
 * https://blog.csdn.net/pjw1217/article/details/114448798
 * https://juejin.cn/post/6844904149448917006
 * https://blog.csdn.net/qq_27579471/article/details/124473365
 */
public class AsyncProperties {

    @Bean
    @ConfigurationProperties("angel.async.meta")
    public MetaProperties angelAsyncMetaProperties() {
        return new MetaProperties();
    }

    @Bean
    @ConfigurationProperties("angel.async.executors")
    public Map<String, ExecutorProperties> angelAsyncExecutorProperties() {
        return Maps.newHashMap();
    }
}

4. application-async.yml

angel:
  async:
    meta:
      enable: true
      info: '我奋力撕破封闭的思绪,震开裂缝!!!'
    executors:
      #      angelDefaultExecutor:
      #        alias: 'DEFAULT'
      #        core-pool-size: 8
      #        max-pool-size: 16
      #        queue-capacity: 32
      #        keep-alive-seconds: 60
      #      angelTestExecutor:
      angelDefaultExecutor:
        alias: 'TEST'
        core-pool-size: 2
        max-pool-size: 4
        queue-capacity: 8
        keep-alive-seconds: 5
#      - {alias: 'DEFAULT', core-pool-size: 8, max-pool-size: 16, queue-capacity: 32, keep-alive-seconds: 60}
#      - {alias: 'TEST', core-pool-size: 2, max-pool-size: 4, queue-capacity: 8, keep-alive-seconds: 5}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肯尼思布赖恩埃德蒙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值