2017-10-25 3 views
1

Ich habe ein Speicherleck in einer unserer Anwendungen analysiert und beim Analysieren eines Heapdumps habe ich festgestellt, dass> 98% des Speichers von Camels SharedProducerServicePool belegt sind. Im Wesentlichen hält es eine Los von RemoteFileProducer in seinem Pool (in diesem speziellen Beispiel etwa 41k). Alle von ihnen haben eine SftpEndpoint.Camel hält SFTP-Verbindungen geöffnet, was zu Speicherleck führt

Das Folgende ist die Camel Route, die schließlich eine Datei über SFTP uploads:

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"); 

Was könnte der Grund sein, dass die SFTP-Verbindungen geschlossen werden nicht oder die Produzenten bekommen erstellt, aber nicht wieder aufgehört haben? Ich kann keinen Hinweis in der offiziellen Dokumentation finden.

Jede Hilfe ist sehr appreaciated :)

Hinweis: Die hier verwendete Caml Version 2.17.0 Camel

Antwort

2

In Ihrem receipientList seines besser die dynamischen Dateinamen als Header zu setzen, zB Exchange.FILE_NAME als die Um zu vermeiden, dass zu viele eindeutige Endpunkte erstellt werden, wird stattdessen derselbe Endpunkt für die gleichen Hosts verwendet.

Und wenn Sie kein Endpunkt-Pooling möchten, können Sie die Option cacheSize auf der Empfängerliste auf einen niedrigeren Wert konfigurieren oder sie deaktivieren.

+0

Danke für Ihre schnelle Antwort! Ich werde es versuchen und danach zu dir zurückkommen. –