Quarts 執行定時任務失敗(.job.entity.ScheduleJobEntity cannot be cast to com.)


1、工作中通過Quarts執行定時任務,啟動時報類型轉換錯誤,就比較納悶,同一個包怎么會轉換失敗。

java.lang.ClassCastException: com.bodata.svc.modules.job.entity.ScheduleJobEntity cannot be cast to com.bodata.svc.modules.job.entity.ScheduleJobEntity
	at com.bodata.svc.modules.job.utils.ScheduleJob.executeInternal(ScheduleJob.java:33)
	at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:75)
	at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)

2021-06-12 23:56:55.086 ERROR 20864 --- [eduler_Worker-1] org.quartz.core.ErrorLogger              : Job (DEFAULT.TASK_1234111111111111111 threw an exception.

org.quartz.SchedulerException: Job threw an unhandled exception.
	at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: java.lang.ClassCastException: com.bodata.svc.modules.job.entity.ScheduleJobEntity cannot be cast to com.bodata.svc.modules.job.entity.ScheduleJobEntity
	at com.bodata.svc.modules.job.utils.ScheduleJob.executeInternal(ScheduleJob.java:33)
	at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:75)
	at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
	... 1 common frames omitted

2、通過網上查找,發現是熱部署惹的禍。

在pom文件中注釋掉一下代碼即可:

<!--<dependency>
<groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <optional>true</optional>
</dependency>-->

JVM判斷兩個類對象是否相同的依據:一是類全稱;一個是類加載器,既然不是類名的問題,那肯定就是類加載器不同導致的。

spring-boot-devtools會檢測類路徑的變化,當類路徑內容發生變化后會自動重啟應用程序。Spring Boot的重啟技術通過使用兩個類加載器。由於使用的是雙類加載機制重啟會非常快,如果啟動較慢也可使用JRebel重加載技術。

(1)base classloader (Base類加載器):加載不改變的Class,如第三方提供的jar包。

(2)restart classloader(Restart類加載器):加載正在開發的Class。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM