springboot定时任务:同时使用定时任务和websocket报错

背景

项目使用了websocket,实现了消息的实时推送。后来项目需要一个定时任务,使用org.springframework.scheduling.annotation的@EnableScheduling注解来实现,启动项目之后报错

clojure 复制代码
Bean 'com.alibaba.cloud.sentinel.custom.SentinelAutoConfiguration' of type [com.alibaba.cloud.sentinel.custom.SentinelAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
scala 复制代码
Destroy method 'close' on bean with name 'nacosServiceRegistry' threw an exception: java.lang.NullPointerException

打断点进入代码发现是这个定时任务的bean为null

学习

由于先写的websocket推送消息,运行正常。之前一个项目只有一个定时任务(没有websocket)也是运行正常。综合网友的分析winky_L,是因为同时使用定时任务和websocket冲突导致

其他的一些学习kzcming
菜菜菜鸡

解决

1在启动类Application中加入task的initialize。【注意:如果继续报错,报错信息如下。报错信息解读:发现两个定时任务的bean,不知道使用哪一个,springboot报错,这时候在 taskScheduler方法中加上@Primary注解,告诉springboot使用这个自定义的定时任务】

bash 复制代码
Method nacosWatch in com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration required a single bean, but 2 were found:
	- taskScheduler: defined by method 'taskScheduler' in class path resource []
	- defaultSockJsTaskScheduler: defined by method 'defaultSockJsTaskScheduler' in class path resource [org/springframework/web/socket/config/annotation/DelegatingWebSocketConfiguration.class]

具体代码【】

bash 复制代码
    @Primary
    @Bean
    public TaskScheduler taskScheduler(){
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        //只有池子里的任务有执行结束后,池子之外的任务才有机会被加入执行。
        // 更糟的情况是,当池子里的任务都在因为异常或业务要求(比如出错无限重试)而导致池子永远无法得到释放,将导致固定值之外的任务永远不会被执行!
        //taskScheduler.setPoolSize允许动态设置池子的大小,可动态设置-> todo 有隐患
        taskScheduler.setPoolSize(10);
        taskScheduler.initialize();
        return taskScheduler;
    }

求解

问题1

刚开始在config类中添加该TaskScheduler 仍然启动不了,然后我放在启动类Application中就能启动成果。不知道这其中的原由

问题2

代码中和的这个线程池初始定义了poolsize,但是这里有隐患。

只有池子里的任务有执行结束后,池子之外的任务才有机会被加入执行。

更糟的情况是,当池子里的任务都在因为异常或业务要求(比如出错无限重试)而导致池子永远无法得到释放,将导致固定值之外的任务永远不会被执行!taskScheduler.setPoolSize允许动态设置池子的大小,可动态设置。看了一篇文章,但是还没有头绪daydayup

bash 复制代码
taskScheduler.setPoolSize(10);
        taskScheduler.initialize();
相关推荐
又是忙碌的一天3 分钟前
Spring IOC:依赖注入和bean的生命周期
java·后端·spring
计算机学姐4 分钟前
基于SpringBoot的个人健康管理系统【2026最新】
java·spring boot·后端·mysql·spring·intellij-idea·mybatis
独自破碎E8 分钟前
Spring是怎么解决循环依赖的?
java·后端·spring
IT_陈寒1 小时前
Redis性能翻倍的5个冷门技巧:从每秒10万到20万的实战优化之路
前端·人工智能·后端
Coder_Boy_2 小时前
基于SpringAI的企业级智能教学考试平台模块四:优化迭代模块内容
人工智能·spring boot
No芒柠Exception2 小时前
Spring Boot 实现分片上传、断点续传与进度条
java·后端
三十_2 小时前
WebRTC 入门:一分钟理解会议系统的三种架构(Mesh/SFU/MCU)
前端·后端·webrtc
源远流长jerry2 小时前
WebSocket 会话心跳保持 + 优雅关闭
网络·websocket·网络协议
嘻哈baby2 小时前
Redis缓存三大问题实战:穿透、雪崩、击穿怎么解决
后端
Cache技术分享2 小时前
282. Java Stream API - 从 Collection 或 Iterator 创建 Stream
前端·后端