gpt4 book ai didi

java - 记录时 OverlappingFileLockException

转载 作者:行者123 更新时间:2023-11-30 11:24:30 24 4
gpt4 key购买 nike

当我在本地机器上启动 jar 文件时,在同一目录中创建了两个日志文件,它们由两个配置为 slf4j 的记录器写入。在前一个案例中一切正常。创建了两个文件。但是当我通过网络驱动器上的文件管理器(TotalCmd,FAR)从我的计算机启动这个 jar 时,会出现 java.nio.channels.OverlappingFileLockException。仅在网络驱动器上的文件夹中创建了第一个文件。

package mypackage;
import java.util.Date;
import java.util.ResourceBundle;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import ru.mycompany.bicomp.app.BaseApp;
import ru.mycompany.db.client.TaskContext;
import ru.mycompany.form.error.JInvErrorService;
import ru.mycompany.jinvecd.impl.ECDAppImpl;


public class ECDApp extends BaseApp {

private static final ResourceBundle resource = ResourceBundle.getBundle("ecd");
private static Logger logger = Logger.getLogger("EcdAppLogger");

@Override
public String getAppID() {
return "XXI.JECD";
}

@Override
protected void initialize(String[] args) {
super.initialize(args); //To change body of generated methods, choose Tools | Templates.
configureLoggerOfApplication();
}

protected String createLoggerFileName() {

return "logs\\" + "ECDAppRootLog." + getAppID() + ".log";
}

private void configureLoggerOfApplication() {
try {
FileHandler fh = new FileHandler(createLoggerFileName(), true);
fh.setFormatter(new SimpleFormatter());
ConsoleHandler ch = new ConsoleHandler();
ch.setFormatter(new SimpleFormatter());
ch.setLevel(Level.ALL);
logger.addHandler(fh);
logger.addHandler(ch);
logger.setLevel(Level.ALL);
logger.info("------------------------Start " + new Date(System.currentTimeMillis()) + "----------------------");
} catch (Throwable ex) {
JInvErrorService.handleException(null, ex);
}
}
}

异常开始于

FileHandler fh = new FileHandler(createLoggerFileName(), true);

文件夹 logs\存在,因为它是由第一个记录器的配置创建的

protected String createDefaultLoggerFileName() {

try {
Path p = FileSystems.getDefault().getPath(".", "logs");
Files.createDirectory(p);
//Files.createDirectory((""));
} catch (IOException ex) {
}

return "logs\\" + getAppID() + ".log";
}

/**
*
*/
protected void configureDefaultLogger() throws IOException {

FileHandler fh = new FileHandler(createDefaultLoggerFileName());

fh.setFormatter(new SimpleFormatter());
Logger defaultLogger = Logger.getLogger("ru.mycompany." + getAppID());

defaultLogger.addHandler(fh);

appLog = LoggerFactory.getLogger("ru.mycompany." + getAppID());

logSystemProperties();
}

谢谢!

最佳答案

此问题归档于 JDK-8031438: FileHandler 抛出 OverlappingFileLockException。即使未标记为已修复 JDK-8048020 的补丁:对 java.util.logging.FileHandler 的回归应该可以解决这个问题。这已在 JDK8u40 中修复。

FileHandler 文档没有声明可以从构造函数中抛出 OverlappingFileLockException。阅读 FileChannel.tryLock文档显示获取锁失败可以通过返回 null 或抛出 OverlappingFileLockException 来指示。 FileHandler.openFiles 方法似乎无法处理抛出 OverlappingFileLockException 的情况,因为它扩展了 IllegalStateException。这是从 FileHandler 抛出的事实表明这是一个错误。

话虽如此,来自 NIO FileLock文档,“一般来说,锁定驻留在网络文件系统上的文件时应格外小心。”因此,即使此错误已修复,您仍可能无法根据 Java API 的契约(Contract)尝试执行的操作。

关于java - 记录时 OverlappingFileLockException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20631880/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com