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) {
+ }
+ }
+}
}