简体   繁体   English

Spring Integration:通过注释配置入站通道适配器

[英]Spring Integration : Inbound Channel Adapter configuration via annotations

How can I configure the inbound channel adapter via annotations instead of the regular configuration file? 如何通过注释而不是常规配置文件配置入站通道适配器? I was able to define the bean for the session factory though as under: 我能够为会话工厂定义bean,但是在下面:

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

How can I configure the inbound channel adapter given as under via annotations? 如何配置在via注释下给出的入站通道适配器?

<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 The modified code is as under @Artem Bilan修改后的代码如下

@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;
}

} }

While running this,I get an exception as under No bean named 'ftpChannel' is defined 运行这个时,我得到一个例外,因为定义了名为'ftpChannel'的无bean

Please note that 'channel' keyword in not available while wiring the Inbound channel adapter,its 'value' instead. 请注意,在为入站通道适配器连接时,“channel”关键字不可用,而是“值”。

I tried wiring the channel with PollableChannel,that also went in vain though. 我尝试用PollableChannel连接频道,但这也是徒劳的。 It is as under: 它如下:

@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;
        }
    };
}

I got an error "failed to send message within timeout: -1".Am I doing something wrong still? 我收到错误“无法在超时内发送消息:-1”。我还做错了什么?

What I'm looking for is to wire up all the beans on application start-up, and then expose some method to start polling the server,process them and then delete them from local,something like this 我正在寻找的是在应用程序启动时连接所有bean,然后公开一些方法来开始轮询服务器,处理它们然后从本地删除它们,像这样的东西

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

where getPollableChannel() gives me the bean I had wired for Polling. 其中getPollableChannel()为我提供了我为Polling连接的bean。

There is an @InboundChannelAdapter for you. 你有一个@InboundChannelAdapter

@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;
}

Plus take a look into the Reference Manual . 另外,请参阅参考手册

Also pay attention, please, for Java DSL for Spring Integration , where the same might look like: 另请注意, 对于Spring Integration的Java DSL ,其中可能看起来像:

@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();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM