背景
項(xiàng)目使用了websocket,實(shí)現(xiàn)了消息的實(shí)時(shí)推送。后來(lái)項(xiàng)目需要一個(gè)定時(shí)任務(wù),使用org.springframework.scheduling.annotation的@EnableScheduling注解來(lái)實(shí)現(xiàn),啟動(dòng)項(xiàng)目之后報(bào)錯(cuò)
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)
Destroy method 'close' on bean with name 'nacosServiceRegistry' threw an exception: java.lang.NullPointerException
打斷點(diǎn)進(jìn)入代碼發(fā)現(xiàn)是這個(gè)定時(shí)任務(wù)的bean為null
學(xué)習(xí)
由于先寫(xiě)的websocket推送消息,運(yùn)行正常。之前一個(gè)項(xiàng)目只有一個(gè)定時(shí)任務(wù)(沒(méi)有websocket)也是運(yùn)行正常。綜合網(wǎng)友的分析winky_L,是因?yàn)橥瑫r(shí)使用定時(shí)任務(wù)和websocket沖突導(dǎo)致
其他的一些學(xué)習(xí)kzcming
菜菜菜雞
解決
1在啟動(dòng)類(lèi)Application中加入task的initialize?!咀⒁猓喝绻^續(xù)報(bào)錯(cuò),報(bào)錯(cuò)信息如下。報(bào)錯(cuò)信息解讀:發(fā)現(xiàn)兩個(gè)定時(shí)任務(wù)的bean,不知道使用哪一個(gè),springboot報(bào)錯(cuò),這時(shí)候在 taskScheduler方法中加上@Primary注解,告訴springboot使用這個(gè)自定義的定時(shí)任務(wù)】
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]
具體代碼【】文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-672509.html
@Primary
@Bean
public TaskScheduler taskScheduler(){
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
//只有池子里的任務(wù)有執(zhí)行結(jié)束后,池子之外的任務(wù)才有機(jī)會(huì)被加入執(zhí)行。
// 更糟的情況是,當(dāng)池子里的任務(wù)都在因?yàn)楫惓;驑I(yè)務(wù)要求(比如出錯(cuò)無(wú)限重試)而導(dǎo)致池子永遠(yuǎn)無(wú)法得到釋放,將導(dǎo)致固定值之外的任務(wù)永遠(yuǎn)不會(huì)被執(zhí)行!
//taskScheduler.setPoolSize允許動(dòng)態(tài)設(shè)置池子的大小,可動(dòng)態(tài)設(shè)置-> todo 有隱患
taskScheduler.setPoolSize(10);
taskScheduler.initialize();
return taskScheduler;
}
求解
問(wèn)題1
剛開(kāi)始在config類(lèi)中添加該TaskScheduler 仍然啟動(dòng)不了,然后我放在啟動(dòng)類(lèi)Application中就能啟動(dòng)成果。不知道這其中的原由
問(wèn)題2
代碼中和的這個(gè)線程池初始定義了poolsize,但是這里有隱患。
只有池子里的任務(wù)有執(zhí)行結(jié)束后,池子之外的任務(wù)才有機(jī)會(huì)被加入執(zhí)行。
更糟的情況是,當(dāng)池子里的任務(wù)都在因?yàn)楫惓;驑I(yè)務(wù)要求(比如出錯(cuò)無(wú)限重試)而導(dǎo)致池子永遠(yuǎn)無(wú)法得到釋放,將導(dǎo)致固定值之外的任務(wù)永遠(yuǎn)不會(huì)被執(zhí)行!taskScheduler.setPoolSize允許動(dòng)態(tài)設(shè)置池子的大小,可動(dòng)態(tài)設(shè)置??戳艘黄恼?,但是還沒(méi)有頭緒daydayup文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-672509.html
taskScheduler.setPoolSize(10);
taskScheduler.initialize();
到了這里,關(guān)于springboot定時(shí)任務(wù):同時(shí)使用定時(shí)任務(wù)和websocket報(bào)錯(cuò)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!