2

xml ファイルの読み取り中に、他のプロセスが xml ファイルを変更しないようにしたいと考えています。これは私のコードです:

final File file = new File(configFilePath);
final FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
final FileLock lock = channel.tryLock();
if (lock == null) {
        throw new MyCustomException(ErrorCode.configurationFileAlreadyLocked);
}
try {
    final Unmarshaller u = JAXBContext.newInstance(Configuration.class).createUnmarshaller();
    u.setSchema(getSchema());
    return u.unmarshal(new StreamSource(file), Configuration.class).getValue();
} finally {
        lock.release();
}

コードを実行すると、原因として IOException を含む javax.xml.bind.UnmarshalException が発生します。

Caused by: java.io.IOException: The process cannot access the file because another process has locked a portion of the file
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:220)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.read(XMLEntityManager.java:2977)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:702)
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:186)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:772)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:200)
... 33 more

ロックを取得するのと同じプロセスであるため、問題はないと思います。

FileLock を取得しなければ、すべて正常に動作します。

JAXB はすでにファイルのロックを処理していますか?

敬具

セバスチャン

4

0 に答える 0