前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >springboot设置bean为默认主要bean

springboot设置bean为默认主要bean

作者头像
用户9131103
发布于 2023-07-17 11:48:04
发布于 2023-07-17 11:48:04
43800
代码可运行
举报
文章被收录于专栏:工作经验工作经验
运行总次数:0
代码可运行

当springboot有多个不能名称但是相同bean的时候,可以使用 @Primary 注解设置其中一个为主要默认bean

有些类它没有用别名去注入bean,会导致注入的时候找到多个相同bean,报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.jinw.config;

import com.jinw.utils.Threads;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * 多线程配置
 *
 * @author admin
 */
@Configuration
@EnableAsync
public class ThreadConfig {
    /**
     * 短信类线程
     */
    public static final String SMS = "smsTaskExecutor";
    /**
     * 默认通用线程池
     */
    public static final String DEFAULT = "defaulTaskExecutor";
    /**
     * 周期性任务线程
     */
    public static final String SCHEDULED = "scheduledExecutorService";

    /**
     * MAIL任务线程
     */
    public static final String MAIL = "mailTaskExecutor";

    // 核心线程池大小
    private int corePoolSize = 50;


    @Bean(DEFAULT)
    @Primary
    public TaskExecutor defaultExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 设置核心线程数
        executor.setCorePoolSize(3);
        // 设置最大线程数
        executor.setMaxPoolSize(3);
        // 设置队列容量
        executor.setQueueCapacity(20);
        // 设置线程活跃时间(秒)
        executor.setKeepAliveSeconds(60);
        // 设置默认线程名称
        executor.setThreadNamePrefix(DEFAULT + "-");
        // 设置拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        return executor;
    }

    @Bean(SMS)
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 设置核心线程数
        executor.setCorePoolSize(3);
        // 设置最大线程数
        executor.setMaxPoolSize(3);
        // 设置队列容量
        executor.setQueueCapacity(20);
        // 设置线程活跃时间(秒)
        executor.setKeepAliveSeconds(60);
        // 设置默认线程名称
        executor.setThreadNamePrefix(SMS + "-");
        // 设置拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        return executor;
    }

    /**
     * 执行周期性或定时任务
     */
    @Bean(SCHEDULED)
    protected ScheduledExecutorService scheduledExecutorService() {
        return new ScheduledThreadPoolExecutor(corePoolSize,
                new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()) {
            @Override
            protected void afterExecute(Runnable r, Throwable t) {
                super.afterExecute(r, t);
                Threads.printException(r, t);
            }
        };
    }

    /**
     * MAIL定时任务
     */
    @Bean(MAIL)
    public TaskExecutor mailTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 设置核心线程数
        executor.setCorePoolSize(3);
        // 设置最大线程数
        executor.setMaxPoolSize(3);
        // 设置队列容量
        executor.setQueueCapacity(20);
        // 设置线程活跃时间(秒)
        executor.setKeepAliveSeconds(60);
        // 设置默认线程名称
        executor.setThreadNamePrefix(MAIL + "-");
        // 设置拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        return executor;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ThreadPoolTaskExecutor线程池参数配置
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/136737.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/22
1.1K0
@Async应用自定义线程池
自定义线程池,可对系统中线程池更加细粒度的控制,方便调整线程池大小配置,线程执行异常控制和处理。在设置系统自定义线程池代替默认线程池时,虽可通过多种模式设置,但替换默认线程池最终产生的线程池有且只能设置一个(不能设置多个类继承AsyncConfigurer)。自定义线程池有如下模式:
玖柒的小窝
2021/12/10
2.5K0
线程池配置类
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.ThreadPoolExecutor; @Configuration publi
周杰伦本人
2022/10/25
3620
SpringBoot - 优雅的实现【异步编程】
Spring3开始提供了@Async注解,我们只需要在方法上标注此注解,此方法即可实现异步调用。 除此之外, 还得需要一个配置类,通过@EnableAsync 来开启异步功能 。
小小工匠
2022/03/03
1.8K0
SpringBoot - 优雅的实现【异步编程】
SpringBoot线程池使用详解
核心线程数,核心线程会一直存活,即使没有任务需要处理。当线程数小于核心线程数时,即使现有的线程空闲,线程池也会优先创建新线程来处理任务,而不是直接交给现有的线程处理。
全栈程序员站长
2022/09/10
2.8K0
SpringBoot线程池使用详解
在Springboot中使用ThreadPoolExecutor线程池
在springboot项目中如果需要用到ThreadPoolExecutor线程池的话是非常方便的。比使用java并发包中的Executors都还方便很多。 实际上spring中的线程池ThreadpoolExecutor只是对java并发包中的线程池的封装。这样便于在spring环境中快速使用。通过几个注解即可,降低了对代码的侵入性。
冬天里的懒猫
2021/09/26
3.8K0
聊聊PowerJob的ThreadPoolConfig
tech/powerjob/server/config/ThreadPoolConfig.java
code4it
2024/01/23
1620
Spring Boot(5) @Async异步线程池详解
在Spring4中,Spring中引入了一个新的注解@Async,这个注解让我们在使用Spring完成异步操作变得非常方便。
黄规速
2022/04/14
5.1K0
Spring Boot(5) @Async异步线程池详解
springboot异步线程实践
我们的业务场景里需要调用外部请求,这个外部系统是一个异构框架,不能直接走 rpc 调用。外部资源处理过程通常不可控,为了提高系统可用性,与外部系统解耦,通常的方案可以走消息队列或者直接 http 调用。http 调用相对轻量,不用额外引入中间件,同时可以将外部调用通过异步线程池提交,避免阻塞业务主流程。
leon 橙
2023/10/31
7320
SpringBoot 线程池
进程是资源分配最小单位,线程是程序执行的最小单位。 计算机在执行程序时,会为程序创建相应的进程,进行资源分配时,是以进程为单位进行相应的分配。每个进程都有相应的线程,在执行程序时,实际上是执行相应的一系列线程。
全栈程序员站长
2022/09/07
1.6K0
SpringBoot:@Async如何自定义线程池以及使用教程
知识浅谈
2024/05/25
1.3K0
SpringBoot:@Async如何自定义线程池以及使用教程
聊聊TaskExecutor的spring托管
本文主要简述下如何设置TaskExecutor的Thread.UncaughtExceptionHandler。
code4it
2018/09/17
1K0
关于Spring中的@Async注解以及为什么不建议使用 - Java技术债务
Async 注解是 Java 8 中的一个注解,用于标识一个方法是异步执行的。当一个方法被标记为 Async 时,该方法将在一个新的线程中执行,并且可以立即返回一个 CompletableFuture 对象。使用 CompletableFuture 可以更轻松地管理异步计算的结果。下面是一个使用 Async 注解的示例代码:
Java技术债务
2024/06/21
1780
SpringBoot异步任务获取HttpServletRequest
在使用框架日常开发中需要在controller中进行一些异步操作减少请求时间,但是发现在使用@Anysc注解后会出现Request对象无法获取的情况,本文就此情况给出完整的解决方案
code2roc
2023/07/19
8140
SpringBoot2.0 基础案例(04):定时任务和异步任务的使用方式
同步调用 程序按照代码顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行; 异步调用 顺序执行时,不等待异步调用的代码块返回结果就执行后面的程序。
知了一笑
2019/07/19
7470
Spring集成线程池
线程池ExecutorService的4种拒绝策略 ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常 ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。 ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,执行后面的任务 ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务 原生线程池
試毅-思伟
2020/02/18
1.1K0
SpringBoot全局线程池
我们在做WS服务器的时候,如果我们在接收消息的方法中对所有用户群发消息的时候,如果不用线程池发送,那么就相当于在该线程中串行的发送消息,如果用户较多,就会占用大量时间,这时就需要使用线程池。
码客说
2022/03/07
1.8K0
自定义spring kafka consumer 线程池
spring-kafka-1.2.3.RELEASE-sources.jar!/org/springframework/kafka/listener/KafkaMessageListenerContainer.java
code4it
2018/09/17
2.3K0
SpringBoot之异步调用@Ansyc
在启动类或者线程池配置类上加注解 @EnableAsync SpringBootApplication // 开启异步执行 @EnableAsync public class XFBlogApplication { public static void main(String[] args) { SpringApplication.run(XFBlogApplication.class, args); } } 定义了线程池的属性类 import java.util.concu
用户10125653
2022/11/10
4850
springbootAsyncConfig配置的处理
​目录 1. 首先定义一个数据的上下文的class文件 2.定义一个springboot线程池的全局方法: 3.关于一些常量的定义,直接在config里面配置即可 1. 首先定义一个数据的上下文的class文件 import java.util.Map; public class DataCaptureContext { private static final ThreadLocal<Map<String, Object>> threadLocalDataCapture = new Thread
小马哥学JAVA
2022/11/17
6240
相关推荐
ThreadPoolTaskExecutor线程池参数配置
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文