我有一个看起来像是在引起问题的问题,因为同时使用了一个类加载器的两个实例。计划任务始终运行两次,而不是一次,即使使用以避免并行使用的设置也是如此。

如何在运行时为给定的类实例唯一标识类加载器实例?我知道它的完全限定名称将是类加载器,包和类名称的组合。我想知道同一类加载器的两个实例是否同时运行。

我尝试使用以下命令进行日志记录,但是就我实际希望看到的东西(等同于唯一线程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 / classes /

---------->父类加载器:
org.apache.catalina.loader.StandardClassLoader@68de123

任何想法表示赞赏。

更新:

感谢您的快速反馈。使用系统哈希码足以确认相同的类加载器。正如评论中所指出的那样,StandardClassLoader上的哈希值在回顾时也很有用。我检查了不同的线程ID。

将Spring与Tomcat和Quartz 1.8调度框架一起使用。

通过提高Spring / 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

最佳答案

System.identityHashCode(getClass().getClassLoader());
将针对不同的classloaders返回不同​​的值。您可以将其用作classloader ID并将其包含在日志信息中。

10-08 20:12