私の春バッチ統合アプリケーションでは、ファイルポーリングは各ファイルのbatchjobを呼び出し、このアプリケーションは複数のサーバー(ノード)で実行されている可能性がありますが、それらはすべて共通のディレクトリを読み込むことになっています。他のインスタンスが同じファイルを処理できないようにファイルをロックします。コードとして以下のSpringバッチ統合でファイルロックを使用するには?
public class MyFileLocker extends AbstractFileLockerFilter{
private final ConcurrentMap<File, FileLock> lockCache = new ConcurrentHashMap<File, FileLock>();
private final ConcurrentMap<File, FileChannel> ChannelCache = new ConcurrentHashMap<File, FileChannel>();
@Override
public boolean lock(File fileToLock) {
FileChannel channel;
FileLock lock;
try {
channel = new RandomAccessFile(fileToLock, "rw").getChannel();
lock = channel.tryLock();
if (lock == null || !lock.isValid()) {
System.out.println(" Problem in acquiring lock!!" + fileToLock);
return false;
}
lockCache.put(fileToLock, lock);
ChannelCache.put(fileToLock, channel);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
@Override
public boolean isLockable(File file) {
return file.canWrite();
}
@Override
public void unlock(File fileToUnlock) {
FileLock lock = lockCache.get(fileToUnlock);
try {
if(lock!=null){
lock.release();
ChannelCache.get(fileToUnlock).close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}今
、私は私の春のバッチを起動し、私はそれが私に
org.springframework.batch.item.fileを与えるflatfileitemreader使用してそのファイルを読み込むしようとすると、 .NonTransientFlatFileException
私はbeacuseファイルがロックされていると信じています。私はいくつかのグーグルをして、NIOLockerが現在のスレッドでも読むことができないようにファイルをロックすることを発見しました。私はlinkを見つけました。ロックされたファイルの読み方を示していますが、バッファを使用しています。 私のファイルをFlatfileItemReaderがアクセスできるようにするにはどうすればいいですか?
お勧めします。
のロックを解除し、削除するために私のロッカークラスのメソッドを作成して、私が読んでいるファイルのサイズがGB単位件まで行くことができますし、そのようなファイルの数千人が存在することができます。このような大きなバッファを作成することをお勧めしますか? –
えええええええええええええええええええええええええええええええええええええええええええええええええええええええええ投稿者:私はまた、ロックされたファイルを読み取るための方法を見つけることができました。おそらく人々はロックを何らかの方法で行い、この 'FileChannel'アプローチを有用なものとして見つけられないかもしれません。ロックされたファイルから一時ファイルにデータを転送することを検討できます。また、 'FlatfileItemReader'の行ごとに最後の行を読み込みます。 'FileChannel.transferTo()'はその目的のためのものです。 –