即使在使用try-with-resources

时间:2017-05-06 03:10:51

标签: java ioexception

我们在tomcat 7上部署了一个应用程序,它生成csv文件,并在成功将它们上传到目标系统后将它们移动到存档文件夹。

我写了一份弹出作业,用于清理早于阈值天数值的文件。

我们收到太多打开文件错误,如下所示

java.nio.file.FileSystemException: /app/CSVArchive: Too many open files
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91) ~[na:1.8.0_71]
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) ~[na:1.8.0_71]
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) ~[na:1.8.0_71]
    at sun.nio.fs.UnixFileSystemProvider.newDirectoryStream(UnixFileSystemProvider.java:427) ~[na:1.8.0_71]
    at java.nio.file.Files.newDirectoryStream(Files.java:457) ~[na:1.8.0_71]
    at java.nio.file.Files.list(Files.java:3451) ~[na:1.8.0_71]
    at com.kg.datahub.service.impl.CleanupServiceImpl.getFiles(CleanupServiceImpl.java:50) ~[kg-datahub-framework-1.0-SNAPSHOT.jar:na]
    at com.kg.datahub.job.FilesCleanupJob.execute(FilesCleanupJob.java:42) ~[kg-datahub-framework-1.0-SNAPSHOT.jar:na]
    at sun.reflect.GeneratedMethodAccessor414.invoke(Unknown Source) ~[na:na]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_71]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_71]
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) ~[spring-context-4.1.5.RELEASE.jar:4.1.5.RELEASE]
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-4.1.5.RELEASE.jar:4.1.5.RELEASE]

下面是我的FilesCleanupJob代码(使用了try-with-resources)

try(final Stream<Path> olderArchiveFiles =cleanupService.getFiles(Paths.get(csvArchiveDirectory), CSV_FILE_PATTHERN, thresholdDate)){
                 LOG.info("Deleting archived files...");
                 cleanupService.deleteFiles(olderArchiveFiles); 
             }

以下是清理服务代码

@Override
    public Stream<Path> getFiles(final Path locationPath, final String filePattern, final Date date) throws IOException {

            final Pattern pattern = Pattern.compile(filePattern);
            final DateFormat dateFormat = new SimpleDateFormat(datePattern);

            final Function<Path, String> captureDatePart = path -> {
                    final String fileName = path.getFileName().toString();
                    final Matcher matcher = pattern.matcher(fileName);
                    return matcher.find() ? matcher.group(1) : StringUtils.EMPTY;
            };

            final Function<String, Date> convertToDate = datePart -> {
                    try {
                            return dateFormat.parse(datePart);
                    } catch (ParseException e) {
                            throw Throwables.propagate(e);
                    }
            };

            final Function<Date, Boolean> checkIsOlder = fileDate -> fileDate.before(date);

            final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher(globPattern);

            return Files.list(locationPath).filter(Files::isRegularFile).filter(pathMatcher::matches).filter(captureDatePart.andThen(convertToDate).andThen(checkIsOlder)::apply);

    }

   @Override
    public void deleteFiles(Stream<Path> files) {
            files.map(Path::toFile).forEach(File::delete);
    }

有什么建议吗?

0 个答案:

没有答案