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。