Pau*_*ora 6 java guava glassfish-3 timertask servlet-listeners
我正在实现ServletContextListener,以便在我的应用服务器(GlassFish 3.1)上安排各种作业.我正在使用contextInitialized()安排重复任务,并 contextDestroyed()调用清理方法,如关闭c3p0:
public class JobScheduler implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
//schedule TimerTasks
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
//cancel TimerTasks
//cleanup methods
}
}
Run Code Online (Sandbox Code Playgroud)
当我取消TimerTasks时,我添加了逻辑,等待任何正在运行的任务在继续之前完成,以确保在清理资源时没有任何内容仍在执行.
回答我的问题:当我取消部署我的应用程序时,我看到GlassFish输出中显示了其中一个或两个警告:
WARNING: Input stream has been finalized or forced closed without being explicitly closed; stream instantiation reported in following stack trace
java.lang.Throwable
at com.sun.enterprise.loader.ASURLClassLoader$SentinelInputStream.<init>(ASURLClassLoader.java:1230)
at com.sun.enterprise.loader.ASURLClassLoader$InternalJarURLConnection.getInputStream(ASURLClassLoader.java:1338)
at sun.misc.URLClassPath$Loader.getResource(URLClassPath.java:503)
at sun.misc.URLClassPath.getResource(URLClassPath.java:169)
at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at com.google.common.base.FinalizableReferenceQueue$DecoupledLoader.loadFinalizer(FinalizableReferenceQueue.java:228)
at com.google.common.base.FinalizableReferenceQueue.loadFinalizer(FinalizableReferenceQueue.java:155)
at com.google.common.base.FinalizableReferenceQueue.<clinit>(FinalizableReferenceQueue.java:84)
at com.google.common.collect.CustomConcurrentHashMap$QueueHolder.<clinit>(CustomConcurrentHashMap.java:651)
at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.<init>(CustomConcurrentHashMap.java:1589)
at com.google.common.collect.CustomConcurrentHashMap$Strength$3.referenceValue(CustomConcurrentHashMap.java:322)
at com.google.common.collect.CustomConcurrentHashMap.newValueReference(CustomConcurrentHashMap.java:1731)
at com.google.common.collect.CustomConcurrentHashMap$Segment.setValue(CustomConcurrentHashMap.java:2050)
at com.google.common.collect.CustomConcurrentHashMap$Segment.put(CustomConcurrentHashMap.java:2430)
at com.google.common.collect.CustomConcurrentHashMap.put(CustomConcurrentHashMap.java:3346)
at MyProject.CacheEngine$MyCustomCache$1.apply(CacheEngine.java:244)
at MyProject.CacheEngine$MyCustomCache$1.apply(CacheEngine.java:237)
at com.google.common.collect.ComputingConcurrentHashMap$ComputingValueReference.compute(ComputingConcurrentHashMap.java:316)
at com.google.common.collect.ComputingConcurrentHashMap$ComputingSegment.compute(ComputingConcurrentHashMap.java:140)
at com.google.common.collect.ComputingConcurrentHashMap.apply(ComputingConcurrentHashMap.java:71)
at com.google.common.collect.MapMaker$ComputingMapAdapter.get(MapMaker.java:848)
//stacktrace of the Runnable called by TimerTask, leading up to a call to Guava ComputingMap
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
Run Code Online (Sandbox Code Playgroud)
从我可以告诉,GlassFish的抱怨了InputStream这是从来没有明确地关闭,这是由开ClassLoader了Finalizer叫我的番石榴一个MapMaker-created计算的地图,这是由工作访问.请注意,上面的堆栈跟踪不是异常,而是从正在运行的任务到流的实例化的实际跟踪.
我需要帮助的是理解为什么InputStream即使我等待所有任务完成,以及我是否能更好地处理其清理,这仍然是开放的.它似乎与Guava的计算图特别相关,您可以在堆栈跟踪中看到它们.
更新:如果我使用ScheduledThreadPoolExecutor而不是,我仍然会收到相同的警告TimerTask
更新2: Tumbleweeded
可能需要使用较新版本的库,以下内容来自 guava java 文档:
FinalizableReferenceQueue() Deprecated.
Run Code Online (Sandbox Code Playgroud)
FinalizedReferenceQueue 是一种不健全的清理引用的机制,因为(1)它的单线程很容易过载,(2)它坚持运行后台线程在某些环境中是有问题的。该类计划于 2012 年 12 月删除。
| 归档时间: |
|
| 查看次数: |
1303 次 |
| 最近记录: |