我编写了一个服务器来接收RMI请求并执行一些操作。
每个请求都会创建一个Log4J Logger实例。以下是用于创建Logger实例的代码片段。
事情在这里运转得很好。问题是在接收大量请求后,此服务器进程的打开文件数量增加并且不会减少,从而崩溃并显示异常信息“打开文件太多”。
经过进一步检查发现,问题是由于请求完成后未释放文件描述符引起的。我尝试查看Log4J文档,但找不到如何关闭仅一个记录器而不影响可能在不同线程中运行的其他记录器的任何内容。
有什么想法吗?
每个请求都会创建一个Log4J Logger实例。以下是用于创建Logger实例的代码片段。
Logger log = Logger.getLogger("log_" + requestID);
log.setAdditivity(false);
FileAppender appender = null;
try {
PatternLayout layout = new PatternLayout("%-5p %C{1} %d{yyyy-MM-dd HH:mm:ss} : %m%n");
appender = new FileAppender(layout, logFileName, false);
} catch(Exception e) {
logger.error("Error initializing logger", e);
}
log.addAppender(appender);
log.setLevel(level);
事情在这里运转得很好。问题是在接收大量请求后,此服务器进程的打开文件数量增加并且不会减少,从而崩溃并显示异常信息“打开文件太多”。
经过进一步检查发现,问题是由于请求完成后未释放文件描述符引起的。我尝试查看Log4J文档,但找不到如何关闭仅一个记录器而不影响可能在不同线程中运行的其他记录器的任何内容。
有什么想法吗?