2013-07-29 51 views
3

我有一個問題,看起來像是由於同時使用兩個類加載器的實例而導致的。計劃任務始終運行兩次而不是一次,即使使用設置以避免併發使用。如何在Java中唯一標識類加載器的實例

如何在運行時唯一標識給定類實例的類加載器實例?我知道它的完全限定名是類加載器,包和類名的組合。我想知道同一個類加載器的兩個單獨實例是否正在同時運行。

我嘗試過使用以下方式進行日誌記錄,但是它並沒有給我提供任何有用的信息,實際上我希望看​​到的內容(相當於獨特的線程ID等)。是的,它確實給出了類加載器及其父名,但這不足以幫助我解決這個問題。

final String classLoaderInfoCurrentThread = Thread.currentThread().getContextClassLoader().toString(); 
final String classLoaderInfoClass = getClass().getClassLoader().toString(); 
logger.debug("Class loader info current thread: " + classLoaderInfoClass); 
logger.debug("Class loader info class: " + classLoaderInfoCurrentThread); 

的上述結果:

類加載信息類:WebappClassLoader

上下文:

委託:假

庫: /WEB-INF /類/

---------->父級oader: [email protected]

任何想法非常讚賞。

更新:

感謝您的快速反饋。使用系統散列碼足以確認相同的類加載器。在回顧過程中,StandardClassLoader上的散列函數也很有用,正如評論中所指出的那樣。我檢查了不同的線程標識符。

Spring使用Tomcat和Quartz 1.8調度框架。

通過提高春/石英記錄,我能確定兩個不同的調度實例被啓動:

org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v1.8.6) 'scheduler' with instanceId '<compname>.local1375104695468' 
org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v1.8.6) 'scheduler' with instanceId '<compname>.local1375104696411' 

這似乎有一個已知的問題與此:

Quartz job runs twice when deployed on tomcat 6/Ubuntu 10.04LTS

+0

'68de123'應該足夠獨特的運行時識別。 – hexafraction

回答

2

System.identityHashCode(getClass().getClassLoader());

將針對不同classloaders返回不同的值。您可以使用它作爲classloader ID並將其包含在日誌記錄信息中。