2016-08-19 3 views
3

Ich habe ein Problem mit Spring Integration. Ich benutze Spring Boot 1.4.0.RELEASE, Spring Integration 4.3.1.RELEASE, Spring Integration DSL 1.2.0.M1.Spring Integration DSL - Outbound Gateway mit Zugriff auf Header

Was ich versuche zu tun:

ich eine Anwendung bin zu schreiben, die Dateien von FTP und lokale Dateisystem (unter Verwendung von Inbound-Channel-Adapter), übertragen Sie die Dateien auf einem lokalen Arbeitsverzeichnis (unter Verwendung von Datei lesen Outbound-Gateways), verarbeiten und dann an ein endgültiges Ziel verschieben (Datei Outbound-Gateway/Adapter).

BEARBEITEN: Das ursprüngliche Problem stammt von falscher Verwendung der OutboundGateway. Für Details zu dem, was ich falsch gemacht habe, schaue dir den Bearbeitungsverlauf an.

Ich habe ein Problem mit der Verdrahtung eines OutboundGateway, die Informationen aus dem Nachrichtenkopf benötigt.

Meine Grundströmung ist:

@Bean 
@SuppressWarnings("unchecked") 
public IntegrationFlow fileSystemReadingFlow() { 
    LOGGER.debug("Building fileSystemReadingFlow."); 
    // Create a FileInboundChannelAdapter 

     return IntegrationFlows.from(s -> s.file(new File(StringUtils.cleanPath(Paths.get(directoryProperties.getLocal() , UNKNOWN).toString()))) 
         // Add a Filter to restrict which files are retrieved 
         .filter(fileListFilterBuilder.buildFileListFilter(File.class)) 
       // Add a poller to continually watch the directory 
       , endpointConfigurer -> endpointConfigurer.poller(poller) 
     ) 
       .enrichHeaders(h -> h.header(FOLDER_NAME, LOCAL)) 
       .handle((message, headers) -> Files.outboundGateway(new File(StringUtils.cleanPath(Paths.get(directoryProperties.getWorking() 
            , (String) headers.get(FOLDER_NAME)).toString()))).deleteSourceFiles(true).autoCreateDirectory(true)) 
       // Send the files to the aggregatingChannel 
       .channel("aggregatingFileChannel") 
       .get(); 
    } 

Die Frage der handle((message, headers) -> Files.outboundGateway(...) Abschnitt ist. Mit der obigen Lambda-Methode spuckt dieser Fehler immer wieder aus.

ErrorMessage [payload=org.springframework.messaging.MessagingException: failed to resolve channel name 'org.springframework.integration.dsl.file.FileWritingMessageHandlerSpec'; nested exception is org.springframework.messaging.core.DestinationResolutionException: failed to look up MessageChannel with name 'org.springframework.integration.dsl.file.FileWritingMessageHandlerSpec' in the BeanFactory.; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.integration.dsl.file.FileWritingMessageHandlerSpec' is defined, headers={id=e3f5f341-6379-0dd0-11e6-e4bff8f455b0, timestamp=1471619276894}] 

Die Dokumentation und meine Tests zeigen, dass die Definition wie folgt funktioniert. Aber wie bekomme ich Zugriff auf die Header?

.handle(Files.outboundGateway(new File("someDir"))).deleteSourceFiles(true).autoCreateDirectory(true)) 

Ich habe versucht, einen Spel Ausdruck verwendet, der die richtige Methode sein kann, aber ich habe es nicht an der Arbeit.

Antwort

1

Nachdem ich die SpEL-Referenz erneut gelesen hatte, konnte ich mein Problem herausfinden. Ich musste explizit auf die statischen Methoden verweisen, die ich aufrufen musste, und dann die Literale richtig entschlüsseln.

.handle(Files.outboundGateway("T(org.springframework.util.StringUtils).cleanPath(T(java.nio.file.Paths).get('" +directoryProperties.getWorking() +"'" + 
            ", headers['"+FOLDER_NAME+"']).toString())").deleteSourceFiles(true).autoCreateDirectory(true)) 
+0

Großartig! Ich schätze, du kannst sogar deine eigene Antwort akzeptieren. –

Verwandte Themen