2011-07-29 16 views
6

我正在实施ServletContextListener以安排我的应用服务器(GlassFish 3.1)上的各种作业。我使用contextInitialized()调度重复的任务,并contextDestroyed()调用清理方法,如关闭C3P0:InputStream从TimerTask调用Guava地图左侧打开; GlassFish抱怨取消部署

public class JobScheduler implements ServletContextListener { 

    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     //schedule TimerTasks 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) { 
     //cancel TimerTasks 
     //cleanup methods 
    } 
} 

当我取消TimerTask S,我已经添加了逻辑等待所有正在运行的任务之前完成继续,以确保在清理资源时没有任何东西仍在执行中。

前往我的问题:当我取消部署我的申请,我看到一个或两个这些警告显示在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) 

从我可以告诉,GlassFish的抱怨的InputStream这是从未明确关闭,由ClassLoader打开Finalizer打开由我的一个Guava MapMaker创建的计算映射,这是由任务访问。 请注意,上面的堆栈跟踪不是一个异常,而是从正在运行的任务到流实例的实际跟踪。

我需要帮助的是理解为什么这个InputStream被打开,即使我正在等待所有任务完成,以及我是否能够更好地处理其清理。它似乎与您可以在堆栈跟踪中看到的番石榴的计算图特别相关。

更新:我仍然得到同样的警告,如果我使用ScheduledThreadPoolExecutor代替TimerTask

更新2: Tumbleweeded

+0

您的代码在哪里管理计时器任务的外观如何? –

+0

没有任何有关TimerTask在做什么的细节,很难提出解决方案。 具体来说,是否有任务打开任何流,套接字或文件? – hidralisk

+0

@hidralisk - 代码库太复杂,无法在此显示。正如您所看到的,警告中的堆栈跟踪显示了流如何实例化。 –

回答

1

可能需要使用该库的更新版本,以下是从番石榴Java文档:

FinalizableReferenceQueue() Deprecated. 

Finali zableReferenceQueue是清理引用的一种不健全的机制,因为它的单线程可以轻松地重载,并且(2)它坚持运行后台线程在某些环境中是有问题的。该课程计划于2012年12月删除。

+0

不幸的是,我不再能够访问我可以确认这是一个修复的代码,但似乎''FinalizableReferenceQueue'可能是这里的问题。标记为已接受。 –