gpt4 book ai didi

java - Java中如何唯一标识类加载器的实例

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:36 26 4
gpt4 key购买 nike

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

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

我尝试使用以下内容进行日志记录,但就我实际希望看到的内容而言,它没有给我任何用处(相当于唯一的线程 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

上下文:

委托(delegate):假

存储库: /WEB-INF/类/

------------> 父类加载器: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());

将为不同的类加载器返回不同的值。您可以将其用作 classloader ID 并将其包含在日志信息中。

关于java - Java中如何唯一标识类加载器的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17925067/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com