src/share/jaxws_classes/com/sun/xml/internal/org/jvnet/mimepull/WeakDataFile.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -23,18 +23,20 @@
  * questions.
  */
 
 package com.sun.xml.internal.org.jvnet.mimepull;
 
+import java.util.concurrent.TimeUnit;
+
 import java.io.File;
 import java.io.IOException;
 import java.io.RandomAccessFile;
 import java.lang.ref.ReferenceQueue;
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.Executor;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
 /**
  * Removing files based on this

@@ -43,39 +45,34 @@
  * @author Jitendra Kotamraju
  */
 final class WeakDataFile extends WeakReference<DataFile> {
 
     private static final Logger LOGGER = Logger.getLogger(WeakDataFile.class.getName());
+    private static int TIMEOUT = 10; //milliseconds
     //private static final int MAX_ITERATIONS = 2;
     private static ReferenceQueue<DataFile> refQueue = new ReferenceQueue<DataFile>();
     private static List<WeakDataFile> refList = new ArrayList<WeakDataFile>();
     private final File file;
     private final RandomAccessFile raf;
     private static boolean hasCleanUpExecutor = false;
     static {
+        int delay = 10;
+        try {
+                delay = Integer.getInteger("com.sun.xml.internal.org.jvnet.mimepull.delay", 10);
+        } catch (SecurityException se) {
+            if (LOGGER.isLoggable(Level.CONFIG)) {
+                LOGGER.log(Level.CONFIG, "Cannot read ''{0}'' property, using defaults.",
+                        new Object[] {"com.sun.xml.internal.org.jvnet.mimepull.delay"});
+            }
+        }
         CleanUpExecutorFactory executorFactory = CleanUpExecutorFactory.newInstance();
         if (executorFactory!=null) {
             if (LOGGER.isLoggable(Level.FINE)) {
                 LOGGER.log(Level.FINE, "Initializing clean up executor for MIMEPULL: {0}", executorFactory.getClass().getName());
             }
-            Executor executor = executorFactory.getExecutor();
-            executor.execute(new Runnable() {
-                @Override
-                public void run() {
-                    WeakDataFile weak;
-                    while (true) {
-                        try {
-                            weak = (WeakDataFile) refQueue.remove();
-                            if (LOGGER.isLoggable(Level.FINE)) {
-                                LOGGER.log(Level.FINE, "Cleaning file = {0} from reference queue.", weak.file);
-                            }
-                            weak.close();
-                        } catch (InterruptedException e) {
-                        }
-                    }
-                }
-            });
+            ScheduledExecutorService scheduler = executorFactory.getScheduledExecutorService();
+            scheduler.scheduleWithFixedDelay(new CleanupRunnable(), delay, delay, TimeUnit.SECONDS);
             hasCleanUpExecutor = true;
         }
     }
 
     WeakDataFile(DataFile df, File file) {

@@ -155,6 +152,26 @@
                 LOGGER.log(Level.FINE, "Cleaning file = {0} from reference queue.", weak.file);
             }
             weak.close();
         }
     }
+
+private static class CleanupRunnable implements Runnable {
+    @Override
+    public void run() {
+        try {
+            if (LOGGER.isLoggable(Level.FINE)) {
+                LOGGER.log(Level.FINE, "Running cleanup task");
+            }
+                WeakDataFile weak = (WeakDataFile) refQueue.remove(TIMEOUT);
+            while (weak != null) {
+                if (LOGGER.isLoggable(Level.FINE)) {
+                    LOGGER.log(Level.FINE, "Cleaning file = {0} from reference queue.", weak.file);
+                }
+                weak.close();
+                weak = (WeakDataFile) refQueue.remove(TIMEOUT);
+            }
+        } catch (InterruptedException e) {
+        }
+    }
+}
 }