15 package com.cloudera.impala.util;
18 import java.util.concurrent.Executors;
19 import java.util.concurrent.ScheduledExecutorService;
20 import java.util.concurrent.ScheduledFuture;
21 import java.util.concurrent.TimeUnit;
22 import java.util.concurrent.atomic.AtomicBoolean;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
27 import com.google.common.annotations.VisibleForTesting;
28 import com.google.common.base.Preconditions;
29 import com.google.common.util.concurrent.ThreadFactoryBuilder;
37 final static Logger
LOG = LoggerFactory.getLogger(FileWatchService.class);
66 Preconditions.checkNotNull(file);
67 Preconditions.checkNotNull(listener);
68 Preconditions.checkArgument(file.exists());
91 long lastChange = file_.lastModified();
93 changeListener_.onFileChange();
99 LOG.warn(
"File does not exist: {}", file_.getPath());
110 Preconditions.checkState(!running_.get());
113 ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(
114 new ThreadFactoryBuilder()
116 .setNameFormat(
"FileWatchThread(" +
file_.getPath() +
")-%d")
122 }
catch (SecurityException e) {
123 LOG.warn(
"Not allowed to check read file existence: " + file_.getPath(), e);
132 public synchronized void stop() {
133 Preconditions.checkState(running_.get());
135 fileCheckFuture_.cancel(
false);
final FileChangeListener changeListener_
ScheduledFuture<?> fileCheckFuture_
final AtomicBoolean running_
FileWatchService(File file, FileChangeListener listener)
static final long DEFAULT_CHECK_INTERVAL_MS
void setCheckIntervalMs(long checkIntervalMs)
synchronized void start()