java - Camel 保持 SFTP 连接打开导致内存泄漏

标签 java memory-leaks apache-camel camel-ftp

我一直在分析我们的一个应用程序中的内存泄漏,在分析堆转储时,我发现 >98% 的内存被 Camels SharedProducerServicePool 占用。本质上,它在其池中保留了很多 RemoteFileProducer(在这个特定示例中大约有 41k)。它们都有一个 SftpEndpoint

下面是最终通过SFTP上传文件的Camel路由:

from("activemq:queue:transform")
        .routeId("TransformJson2Avro")
        .process(new FileListCountProcessor())
    .split(body()).streaming()
        .setHeader("CURRENT_FILE", simple("${body}"))
        .log("File to process: ${header.CURRENT_FILE}; Flags: "
                + Json2AvroTransformationFlags.FILE_AVRO_BACKUP + "=${header." + Json2AvroTransformationFlags.FILE_AVRO_BACKUP + "}, "
                + Json2AvroTransformationFlags.FILE_AVRO_SFTP + "=${header." + Json2AvroTransformationFlags.FILE_AVRO_SFTP + "}, "
                + Json2AvroTransformationFlags.FILE_JSON_BACKUP + "=${header." + Json2AvroTransformationFlags.FILE_JSON_BACKUP + "}, "
                + Json2AvroTransformationFlags.FILE_JSON_DELETE + "=${header." + Json2AvroTransformationFlags.FILE_JSON_DELETE + "}, "
                + "EXPORT_METHOD=${header.EXPORT_METHOD}")
        .convertBodyTo(File.class)
        .process(new Json2AvroProcessor(filenamePattern, tempFilePath))
        .choice()
            .when(header(Json2AvroTransformationFlags.FILE_AVRO_BACKUP).isEqualTo("true"))
                .to("file:///?fileName=${header.ARCHIVE_FOLDER}/${property.FILENAME}")
                .log("Transformed file: '${property.FILENAME}' (archived to '${header.ARCHIVE_FOLDER}')")
        .end()
        .choice()
            .when(header(Json2AvroTransformationFlags.FILE_AVRO_SFTP).isEqualTo("true"))
                .log("Upload to SFTP '" + getSFTPExportStringForLogging() + "'")
                .recipientList(simple("sftp://${header.SFTP_USER}@${header.SFTP_HOST}:${header.SFTP_PORT}/${header.SFTP_DIR}?password=${header.SFTP_PASSWORD}&fileName=${property.FILENAME}&disconnect=true")).end()
        .end()
        .process(new JsonFileOperationProcessor(backupPath))
    .aggregate(constant(true), new DisabledAggregationStrategy())
        .completionSize(simple("${property.fileListCount}"))
        .log("Number of files: ${property.fileListCount}")
    .to("activemq:queue:transformCompleted")
        .id("insertIntoMessageQueue");

SFTP 连接未关闭或生产者已创建但未再次停止的原因可能是什么?我在官方文档中找不到提示。

非常感谢任何帮助:)

注意:这里使用的Caml版本是Camel 2.17.0

最佳答案

在您的 receipientList 中,最好将动态文件名设置为 header ,例如 Exchange.FILE_NAME 作为键,以避免创建太多唯一的端点,相反,您将为相同的主机。

如果您不需要任何端点池,您可以将收件人列表上的 cacheSize 选项配置为较低的值,或者将其关闭。

关于java - Camel 保持 SFTP 连接打开导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46936606/

相关文章:

java - 如何在Servlet中写入txt文件并在请求时自动下载

c - 在函数中释放取消引用的堆分配 block

networking - Haskell 套接字编程 - 内存泄漏

java - Apache Camel/Spring DSL 中 header 值的 xpath 内的子字符串

java - Camel/Spring 无法识别正确的重载方法

java - 当用户单击主页按钮时终止 Activity

java - 跳过 33/31/32 帧,尽管我使用的是 runOnUiThread

c# - 这个函数的内存泄漏在哪里?

java - 如果我有选择操作,谁能告诉我如何测试我的 Camel 路线?

java - 访问小程序的 javascript 支持重载吗?