Я написал Сервер, который получает запросы RMI и выполняет некоторые операции.
Для каждого запроса создается экземпляр 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);
Здесь все отлично работает. Проблема заключается в том, что после получения большого количества запросов происходит сверхурочное время, число открытых файлов для этого серверного процесса увеличивается и не снижается, что приводит к сбою процесса с исключением: 1006 * слишком много открытых файлов .
При дальнейшей проверке было установлено, что проблема в том, что дескрипторы файлов не освобождаются после завершения запроса. Я попытался просмотреть документацию Log4J, но не смог найти ничего о том, как я могу закрыть только один регистратор, не затрагивая другие, которые могут работать в разных потоках.
Есть идеи здесь?