diff --git a/modules/tracing/mule-tracer-common/src/main/java/org/mule/runtime/tracer/common/watcher/TracingConfigurationFileWatcher.java b/modules/tracing/mule-tracer-common/src/main/java/org/mule/runtime/tracer/common/watcher/TracingConfigurationFileWatcher.java index beb6e0601a04..70f07aa3b93c 100644 --- a/modules/tracing/mule-tracer-common/src/main/java/org/mule/runtime/tracer/common/watcher/TracingConfigurationFileWatcher.java +++ b/modules/tracing/mule-tracer-common/src/main/java/org/mule/runtime/tracer/common/watcher/TracingConfigurationFileWatcher.java @@ -6,11 +6,19 @@ */ package org.mule.runtime.tracer.common.watcher; +import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; import static org.mule.runtime.tracer.exporter.config.api.OpenTelemetrySpanExporterConfigurationProperties.MULE_OPEN_TELEMETRY_EXPORTER_CONFIGURATION_WATCHER_DEFAULT_DELAY_PROPERTY; import static org.slf4j.LoggerFactory.getLogger; import java.io.File; +import java.io.IOException; +import java.nio.file.FileSystems; +import java.nio.file.Path; +import java.nio.file.WatchEvent; +import java.nio.file.WatchKey; +import java.nio.file.WatchService; +import java.util.concurrent.TimeUnit; import org.slf4j.Logger; @@ -23,44 +31,42 @@ public class TracingConfigurationFileWatcher extends Thread { public final long DEFAULT_DELAY = Long .getLong(MULE_OPEN_TELEMETRY_EXPORTER_CONFIGURATION_WATCHER_DEFAULT_DELAY_PROPERTY, 60000l); - private final String filename; private final Runnable doOnChange; + private final File file; + private final WatchService watchService; protected long delay = DEFAULT_DELAY; - private final File file; - private long lastModified; - private boolean warnedAlready; public TracingConfigurationFileWatcher(String filename, Runnable doOnChange) { super("FileSpanExporterConfigurationWatcher"); - this.filename = filename; this.file = new File(filename); this.doOnChange = doOnChange; - this.lastModified = file.lastModified(); + + try { + this.watchService = FileSystems.getDefault().newWatchService(); + file.toPath().getParent().register(watchService, ENTRY_MODIFY); + } catch (IOException e) { + throw new RuntimeException(e); + } + this.setDaemon(true); } - protected void checkAndConfigure() { - boolean fileExists; - try { - fileExists = file.exists(); - } catch (SecurityException var4) { - LOGGER.warn("The tracing config file " + filename + " was possibly removed."); - this.interrupt(); + protected void checkAndConfigure() throws InterruptedException { + WatchKey key = watchService.poll(delay, TimeUnit.MILLISECONDS); + if (key == null) { return; } - if (fileExists) { - long fileLastMod = file.lastModified(); - if (fileLastMod > lastModified) { - this.lastModified = fileLastMod; - this.doOnChange(); - this.warnedAlready = false; + for (WatchEvent event : key.pollEvents()) { + if (ENTRY_MODIFY.equals(event.kind())) { + Path changedFile = (Path) event.context(); + if (changedFile.equals(file.toPath().getFileName())) { + this.doOnChange(); + } } - } else if (!this.warnedAlready) { - LOGGER.warn("Configuration for file exporter was not found. It was possibly removed."); - this.warnedAlready = true; } + key.reset(); } @Override @@ -68,8 +74,7 @@ public void run() { while (!interrupted()) { try { checkAndConfigure(); - sleep(delay); - } catch (InterruptedException var2) { + } catch (InterruptedException ignored) { return; } } diff --git a/modules/tracing/mule-tracer-exporter-configuration-impl/src/test/java/org/mule/runtime/tracer/exporter/config/impl/FileSpanExporterConfigurationTestCase.java b/modules/tracing/mule-tracer-exporter-configuration-impl/src/test/java/org/mule/runtime/tracer/exporter/config/impl/FileSpanExporterConfigurationTestCase.java index 69db362e1835..9e64e4f90030 100644 --- a/modules/tracing/mule-tracer-exporter-configuration-impl/src/test/java/org/mule/runtime/tracer/exporter/config/impl/FileSpanExporterConfigurationTestCase.java +++ b/modules/tracing/mule-tracer-exporter-configuration-impl/src/test/java/org/mule/runtime/tracer/exporter/config/impl/FileSpanExporterConfigurationTestCase.java @@ -183,7 +183,7 @@ public void whenValueCorrespondingToPathGetAbsoluteValue() { assertThat(keyFileLocationPath.isAbsolute(), is(TRUE)); } - @Test @Ignore("To be fixed in W-16676258") + @Test public void configurationFileChanged() throws Exception { File file = createTempFile("tracing", "test"); Path testFile = get(file.getPath());