feat: File watching service
This commit is contained in:
parent
8d03c86c8f
commit
12ca1369f3
2 changed files with 81 additions and 0 deletions
5
src/main/java/eu/ztsh/lfr/files/FileModifiedEvent.java
Normal file
5
src/main/java/eu/ztsh/lfr/files/FileModifiedEvent.java
Normal file
|
@ -0,0 +1,5 @@
|
|||
package eu.ztsh.lfr.files;
|
||||
|
||||
public record FileModifiedEvent(long timestamp) {
|
||||
|
||||
}
|
76
src/main/java/eu/ztsh/lfr/files/WatcherService.java
Normal file
76
src/main/java/eu/ztsh/lfr/files/WatcherService.java
Normal file
|
@ -0,0 +1,76 @@
|
|||
package eu.ztsh.lfr.files;
|
||||
|
||||
import eu.ztsh.lfr.config.DataProperties;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
||||
import org.springframework.context.ApplicationEventPublisher;
|
||||
import org.springframework.context.event.EventListener;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.FileSystems;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardWatchEventKinds;
|
||||
import java.nio.file.WatchKey;
|
||||
import java.nio.file.WatchService;
|
||||
|
||||
@Service
|
||||
public class WatcherService {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(WatcherService.class);
|
||||
|
||||
private final WatchService watchService;
|
||||
private final ApplicationEventPublisher eventPublisher;
|
||||
|
||||
private final String fileName;
|
||||
|
||||
@Autowired
|
||||
public WatcherService(DataProperties dataProperties, ApplicationEventPublisher eventPublisher) throws IOException {
|
||||
this.eventPublisher = eventPublisher;
|
||||
this.watchService = FileSystems.getDefault().newWatchService();
|
||||
|
||||
var filePath = Paths.get(dataProperties.fileUrl());
|
||||
fileName = filePath.getFileName().toString();
|
||||
filePath.getParent().register(
|
||||
watchService,
|
||||
// register file creation as some editors modify files in temp, and then replaces original file.
|
||||
StandardWatchEventKinds.ENTRY_CREATE,
|
||||
StandardWatchEventKinds.ENTRY_MODIFY
|
||||
);
|
||||
}
|
||||
|
||||
@SuppressWarnings("BusyWait")
|
||||
@EventListener(ApplicationReadyEvent.class)
|
||||
public void watch() throws InterruptedException {
|
||||
WatchKey key;
|
||||
while ((key = watchService.take()) != null) {
|
||||
/*
|
||||
When modifying in IntelliJ, one line edit ends with:
|
||||
ENTRY_CREATE: temperatures.csv~
|
||||
ENTRY_MODIFY: temperatures.csv~
|
||||
ENTRY_MODIFY: temperatures.csv~
|
||||
ENTRY_MODIFY: temperatures.csv
|
||||
ENTRY_MODIFY: temperatures.csv
|
||||
ENTRY_MODIFY: temperatures.csv
|
||||
Thread.sleep is used to filter out duplicated events.
|
||||
origin: https://stackoverflow.com/a/25221600
|
||||
*/
|
||||
Thread.sleep(50);
|
||||
var maybeLastEvent = key.pollEvents().stream()
|
||||
.filter(event -> event.context() != null)
|
||||
.filter(event -> event.context().toString().endsWith(fileName))
|
||||
.reduce((o1, o2) -> o2);
|
||||
if (maybeLastEvent.isPresent()) {
|
||||
var lastEvent = maybeLastEvent.get();
|
||||
log.info("Got event of kind:{}", lastEvent.kind());
|
||||
eventPublisher.publishEvent(new FileModifiedEvent(System.currentTimeMillis()));
|
||||
} else {
|
||||
log.trace("Got event for not watched file");
|
||||
}
|
||||
key.reset();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue