2016-01-29 65 views
0

我在Spring批處理應用程序中使用Java NIO。應用程序在不同JVM上運行的所有應用程序實例中查找/ shared共享磁盤所在的目錄(例如/ shared/inbox)。移動文件時不釋放鎖

爲了避免多個線程讀取相同的文件,在我的ItemReader中,我使用FileLock並避免其他線程從中讀取它。

當我完成閱讀時,我想將文件移動到另一個目錄(例如/ shared/archive)。但是Files.move方法不能做到這一點,除非我放棄FileLocl,並且如果我放棄了鎖定,我會冒着其他線程挑選文件的風險。

問題是,我可以將文件從收件箱歸檔而不放棄FileLock嗎?

+0

那麼顯然不是文件。使用共享文件夾將無濟於事。 – EJP

+0

難道你不能只複製文件,鎖定新文件,然後釋放舊鎖? –

+0

我最終通過創建另一個tmp文件來解決問題,以指示我的應用程序的其他線程該文件已被線程拾取。然後我釋放鎖並移動文件。不夠優雅,但它現在完成了這項工作。 –

回答

0

嘗試複製使用java.nio.channels.FileChannel

private static void copyFileUsingFileChannels(File source, File dest)throws IOException { 
    FileChannel inputChannel = null; 
    FileChannel outputChannel = null; 
    try { 
     inputChannel = new FileInputStream(source).getChannel(); 
     outputChannel = new FileOutputStream(dest).getChannel(); 

     outputChannel.transferFrom(inputChannel, 0, inputChannel.size()); 
    } finally { 
     inputChannel.close(); 
     outputChannel.close(); 
    } 
} 

好運