java - Flere tråde kan flytte den samme fil ved hjælp af ATOMIC\_MOVE på Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har multithreaded ansøgning. Min app har Spring scheduler, der starter flere tråde, der behandler filen fra en bestemt placering. Jeg får filen til at behandle ved at ringe Files.newDirectoryStream(taskFolder, filter) og iterere over resultatet. Jeg skal sørge for, at kun en tråd tager filer til behandling. Jeg forsøger at omdøbe filen ved hjælp af ATOMIC\_MOVE for at markere, at den bliver behandlet af nogle tråd. Jeg forventer, at andre tråde ikke kan omdøbe denne fil (MoveFileException skal kastes), hvilket resulterer i, at filen ikke behandles af dem tråde (logik i fangstblok på MoveFileException slutter processen).


try {
    Files.move(source, target, StandardCopyOption.ATOMIC\_MOVE);
} catch (IOException e) {
    throw new MoveFileException("An error occurred while moving the file from: " + source.toString() + " to: " + target.toString(), e);
}


Men det virker ikke, men 2 eller flere tråde kan omdøbe min fil uden nogen undtagelse. Så hvordan kan jeg sikre, at filen kun vil blive taget med en tråd.


EDIT


Jeg leverer mere kode for at forstå, hvad jeg vil gøre.


Import.java


for (Path path : filesToProcessPath) {
    final FileToProcessRepresentation fileToProcessRepresentation = new FileToProcessRepresentation(path.toString());

    try {
        fileRepository.moveFileToPendingState(fileToProcessRepresentation);
    } catch (MoveFileException e) {
        LOGGER.debug("File [" + fileToProcessRepresentation.getUri() + "] could be process by another thread", e);
        continue;
    } catch (Exception e) {
        LOGGER.error(e.getMessage(), e);
        continue;
    }

    //logic

}


FileRespository.java


public void moveFileToPendingState(final FileToProcessRepresentation fileToMove) throws MoveFileException {
    moveFiles(fileToMove, fileToMove.getPendingUri());
    fileToMove.toPending();
}

private void moveFiles(final FileToProcessRepresentation s, final String uri) throws MoveFileException {
    Path sourceFile = Paths.get(s.getUri());
    Path destinationFile = Paths.get(uri);
    moveFiles(sourceFile, destinationFile);
}

private void moveFiles(final Path source, final Path target) throws MoveFileException {
    try {
        Files.move(source, target, StandardCopyOption.ATOMIC\_MOVE);
    } catch (IOException e) {
        throw new MoveFileException("An error occurred while moving the file from: " + source.toString() + " to: " + target.toString(), e);
    }
}

Bedste reference


Jeg har endelig løst mit problem bare tilføj synchronized til moveFileToPendingState metoden.