2013-07-29 2 views
3

У меня проблема, которая выглядит так, как будто она вызвана тем, что одновременно используются два экземпляра загрузчика классов. Запланированная задача всегда запускается дважды, а не один раз, даже с настройками, чтобы избежать одновременного использования.Как однозначно идентифицировать экземпляр загрузчика классов в Java

Как я могу однозначно идентифицировать экземпляр загрузчика класса для данного экземпляра класса во время выполнения? Я знаю, что его полное имя будет сочетаться с именем classloader, package и class. Я хочу знать, работают ли одновременно два отдельных экземпляра одного загрузчика классов.

Я попытался войти в систему, используя следующее, но это не дало мне ничего полезного с точки зрения того, что я на самом деле надеялся увидеть (что-то эквивалентное уникальному идентификатору потока и т. Д.). да, это дает тип загрузчика классов и его родительское имя, но этого недостаточно, чтобы помочь мне в этой проблеме.

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/классы/

----------> Родительский классl oader: [email protected]

Любые идеи, которые были оценены.

ОБНОВЛЕНИЕ:

Благодарим за обратную связь. Использование системного hashcode было достаточным для подтверждения того же загрузчика классов. Хэш на StandardClassLoader также был полезен ретроспективно, как это было сказано в комментариях. Я запустил проверку идентификаторов потоков, которые отличаются.

Использование Spring с Tomcat и каркасом Quartz 1.8.

Поднимая протоколирование на весну/Quartz, я могу определить, что два разных экземпляра планировщика быть запущен:

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 и включить его в информацию о регистрации.

Смежные вопросы