2016-07-14 4 views
1

Wie kann ich den eingehenden Kanaladapter über Anmerkungen anstelle der regulären Konfigurationsdatei konfigurieren? Ich konnte die Bohne für die Sitzung Fabrik definieren, obwohl, wie unter:Spring Integration: Inbound Channel Adapter-Konfiguration über Anmerkungen

@Bean 
public DefaultFtpSessionFactory ftpSessionFactory() { 
     DefaultFtpSessionFactory ftpSessionFactory = new 
     DefaultFtpSessionFactory(); 
     ftpSessionFactory.setHost(host); 
     ftpSessionFactory.setPort(port); 
     ftpSessionFactory.setUsername(username); 
     ftpSessionFactory.setPassword(password); 
     return ftpSessionFactory; 
    } 

Wie kann ich den eingehenden Kanaladapter konfigurieren, wie unter über Anmerkungen gegeben?

<int-ftp:inbound-channel-adapter id="ftpInbound" 
           channel="ftpChannel" 
           session-factory="ftpSessionFactory" 
           filename-pattern="*.xml" 
           auto-create-local-directory="true" 
           delete-remote-files="false" 
           remote-directory="/" 
           local-directory="ftp-inbound" 
           local-filter="acceptOnceFilter"> 

    <int:poller fixed-delay="60000" max-messages-per-poll="-1"> 
     <int:transactional synchronization-factory="syncFactory" /> 
    </int:poller> 

</int-ftp:inbound-channel-adapter> 

@Artem Bilan Der modifizierte Code ist wie unter

@EnableIntegration 
@Configuration 
public class FtpConfiguration { 
    @Value("${ftp.host}") 
    private String host; 
    @Value("${ftp.port}") 
    private Integer port; 
    @Value("${ftp.username}") 
    private String username; 
    @Value("${ftp.password}") 
    private String password; 
    @Value("${ftp.fixed.delay}") 
    private Integer fixedDelay; 
    @Value("${ftp.local.directory}") 
    private String localDirectory; 

    private final static Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); 

@Bean 
public SessionFactory<FTPFile> ftpSessionFactory() { 
    DefaultFtpSessionFactory sessionFactory = new DefaultFtpSessionFactory(); 
    sessionFactory.setHost(host); 
    sessionFactory.setPort(port); 
    sessionFactory.setUsername(username); 
    sessionFactory.setPassword(password); 
    return new CachingSessionFactory<FTPFile>(sessionFactory); 
} 

@Bean 
public FtpInboundFileSynchronizer ftpInboundFileSynchronizer() { 
    FtpInboundFileSynchronizer fileSynchronizer = new FtpInboundFileSynchronizer(ftpSessionFactory()); 
    fileSynchronizer.setDeleteRemoteFiles(false); 
    fileSynchronizer.setRemoteDirectory("/"); 
    fileSynchronizer.setFilter(new FtpSimplePatternFileListFilter("*.xml")); 
    return fileSynchronizer; 
} 

@Bean 
@InboundChannelAdapter(value = "ftpChannel", 
     poller = @Poller(fixedDelay = "60000", maxMessagesPerPoll = "-1")) 
public MessageSource<File> ftpMessageSource() { 
    FtpInboundFileSynchronizingMessageSource source = 
      new FtpInboundFileSynchronizingMessageSource(ftpInboundFileSynchronizer()); 
    source.setLocalDirectory(new File(localDirectory)); 
    source.setAutoCreateLocalDirectory(true); 
    source.setLocalFilter(new AcceptOnceFileListFilter<File>()); 
    return source; 
} 

}

Während dies ausgeführt wird, erhalte ich eine Ausnahme, wie unter Keine Bean mit dem Namen 'ftpChannel' definiert ist

Bitte beachten Sie, dass das Schlüsselwort "channel" nicht verfügbar ist, während der Inbound-Channel-Adapter mit seinem "Wert" verknüpft wird.

Ich versuchte den Kanal mit PollableChannel zu verdrahten, das ging aber auch vergebens. Es ist, als unter:

@Bean 
public MessageChannel ftpChannel() { 
    return new PollableChannel() { 
     @Override 
     public Message<?> receive() { 
      return this.receive(); 
     } 

     @Override 
     public Message<?> receive(long l) { 
      return null; 
     } 

     @Override 
     public boolean send(Message<?> message) { 
      return false; 
     } 

     @Override 
     public boolean send(Message<?> message, long l) { 
      return false; 
     } 
    }; 
} 

ich einen Fehler bekam „failed Nachricht innerhalb Timeout senden: -1“ .Am ich etwas falsch noch tun?

Was ich suche ist es, alle Bohnen auf Anfrage verkabeln Inbetriebnahme, und dann einige Verfahren aussetzen Abfrage der Server, verarbeiten sie starten und sie dann von den lokalen zu löschen, so etwas wie dieses

public void startPollingTheServer() { 
    getPollableChannel().receive(); 
} 

wo GetPollableChannel() gibt mir die Bohne, die ich für Polling verdrahtet hatte.

Antwort

3

Es gibt eine für Sie.

@Bean 
public FtpInboundFileSynchronizer ftpInboundFileSynchronizer() { 
    FtpInboundFileSynchronizer fileSynchronizer = new FtpInboundFileSynchronizer(ftpSessionFactory()); 
    fileSynchronizer.setDeleteRemoteFiles(false); 
    fileSynchronizer.setRemoteDirectory("/"); 
    fileSynchronizer.setFilter(new FtpSimplePatternFileListFilter("*.xml")); 
    return fileSynchronizer; 
} 

@Bean 
@InboundChannelAdapter(channel = "ftpChannel") 
public MessageSource<File> ftpMessageSource() { 
    FtpInboundFileSynchronizingMessageSource source = 
      new FtpInboundFileSynchronizingMessageSource(ftpInboundFileSynchronizer()); 
    source.setLocalDirectory(new File("ftp-inbound")); 
    source.setAutoCreateLocalDirectory(true); 
    source.setLocalFilter(new AcceptOnceFileListFilter<File>()); 
    return source; 
} 

Werfen Sie einen Blick in die Reference Manual.

beachten Sie auch, bitte, für Java DSL for Spring Integration, wo das gleiche aussehen könnte:

@Bean 
public IntegrationFlow ftpInboundFlow() { 
    return IntegrationFlows 
      .from(s -> s.ftp(this.ftpSessionFactory) 
          .preserveTimestamp(true) 
          .remoteDirectory("ftpSource") 
          .regexFilter(".*\\.txt$") 
          .localFilename(f -> f.toUpperCase() + ".a") 
          .localDirectory(this.ftpServer.getTargetLocalDirectory()), 
        e -> e.id("ftpInboundAdapter").autoStartup(false)) 
      .channel(MessageChannels.queue("ftpInboundResultChannel")) 
      .get(); 
} 
+0

Siehe auch https://github.com/spring-projects/spring-integration/pull/1851 –

+0

Bitte beachten dass @artem keine Benachrichtigung über die Bearbeitung Ihrer Fragen erhält - Sie müssten hier einen Kommentar hinzufügen, der besagt, dass Sie Änderungen vorgenommen haben, um eine Benachrichtigung zu erhalten. 'channel' wurde in Version 4.3.0 als Alias ​​für' value' hinzugefügt - dies behebt auch das Problem des fehlenden Kanals. Wenn Sie aus irgendeinem Grund nicht zu 4.3 wechseln können, können Sie den Kanal explizit als '@ Bean' (' DirectChannel') definieren. –

+0

Ich könnte dies funktioniert durch Bereitstellung eines Warteschlangen-Kanals wie unter: @Bean öffentlichen MessageChannel ftpChannel() { zurückgeben neue QueueChannel (10); } – Anish

Verwandte Themen