Linux (Redhat6) ファイルシステム上の単一のフォルダーをリッスンする WatchService を実装しました。(WinSCP 経由で) ファイルをフォルダーにドラッグ アンド ドロップすると、ファイルが検出されて処理されます。ただし、FTP プロセスがファイルをフォルダーにドロップすると、. 拾われない??
これはスレッドコードです
@Override
public void run() {
log.info("Starting " + NAME);
while (mustLive) {
try {
// get Event or wait for one
WatchKey watchKey = watchService.take();
// log.debug("Event found");
// we are only interested in Create Events
List<WatchEvent<?>> events = watchKey.pollEvents();
for (WatchEvent<?> event : events) {
// we need to get the Absolute Path, so more code is needed
// to retrieve it.
Path dir = (Path) watchKey.watchable();
Path fullPath = dir.resolve((Path) event.context());
if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
log.debug("Created: " + event.context().toString());
// callback to process the file
caller.processNotificationFile(fullPath, eps);
}
if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
// log.debug("Delete: " + event.context().toString());
}
if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) {
// log.debug("Modify: " + event.context().toString());
}
}
// reset the Watcher for new
boolean resetOK = watchKey.reset();
if (!resetOK) {
log.debug("Reset NOK");
continue;
}
} catch (InterruptedException e) {
killThread();
}
}
}
監視対象のフォルダーで同じファイル (取得する必要がある) を削除してドロップすると、それが検出されて取得されます (したがって、ウォッチャーは動作し、稼働しています)。そのため、FTP コピーのどこかで問題が発生します。唯一の違いは、ファイルがルートとしてフォルダーに FTP 送信されることですが、すべてのファイルに対して読み取りアクセスがオンになっています。ファイルをSCPするとき、私は別のユーザーです(WatcherThreadを所有する同じユーザーです)。
これは、別のユーザーが所有するファイルが取得されないという問題ですか? もしそうなら、これを修正する方法は?
助けてくれてありがとう、コーエン
更新: root 以外の 2 人の異なるユーザーで SCP を試みたところ、ファイルが検出され、取得されました。フォルダ全体に umask 0000 を設定しようとしましたが、効果はありませんでした。