【问题标题】:Spring integration DSL creating Sftp OutBound Adapter in java 1.7Spring集成DSL在java 1.7中创建Sftp OutBound Adapter
【发布时间】:2015-07-14 15:13:44
【问题描述】:

我在 spring DSL 中创建了一个 Sftp 出站流,我还在 Sftp 出站流之上创建了一个文件入站流,用于从我的本地目录中查找文件并将其发送到负责复制的消息通道文件到远程目录,但是当我运行我的代码时,没有文件被复制到远程目录中。所以我陷入了这一点,任何人都可以提供任何指向它的指针,因为我无法继续。

这是我的会话工厂...

    @Autowired
    private DefaultSftpSessionFactory sftpSessionFactory;

    @Bean
    public DefaultSftpSessionFactory sftpSessionFactory() {
        DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(
                true);
        factory.setHost("111.11.12.143");
        factory.setPort(22);
        factory.setUser("sftp");
        factory.setPassword("*******");         
        return factory;
    }

这是我的 sftp 出站流程..

    @Bean
    public IntegrationFlow sftpOutboundFlow() {
        return IntegrationFlows
                .from("toSftpChannel")
                .handle(Sftp.outboundAdapter(this.sftpSessionFactory)
                        .remoteFileSeparator("\\")
                        .useTemporaryFileName(false)
                        .remoteDirectory(remDir)).get();
    }

这是我的文件入站流程..

    @Bean
    public IntegrationFlow fileReadingFlow() {
        return IntegrationFlows
                .from(fileMessageSource(),
                         new Consumer<SourcePollingChannelAdapterSpec>() {

                    @Override
                    public void accept(SourcePollingChannelAdapterSpec e) {
                        e.poller(Pollers.fixedRate(6));
                    }
                })
                .transform(Transformers.fileToByteArray())
                .channel(MessageChannels.queue("fileReadingResultChannel"))
                .get();
    }

这是 MessageSource 方法.......

    @Bean
    public MessageSource<File> fileMessageSource() {

        FileReadingMessageSource source = new FileReadingMessageSource();
        source.setDirectory(new File(localDir));
        source.setAutoCreateDirectory(true);
        System.out.println("enter fileMessageSource....."+ source.receive());
        return source;
    }

这是我的 Junit 测试方法...

@Autowired
private DefaultSftpSessionFactory sftpSessionFactory;

@Autowired
@Qualifier("toSftpChannel")
private MessageChannel toSftpChannel;

@Autowired  
@Qualifier("fileReadingResultChannel")
private PollableChannel fileReadingResultChannel;

@Test
public void testSftpOutboundFlow() {        
    Message<?> message = ((PollableChannel) fileReadingResultChannel)
            .receive(600);
    System.out.println("message....."+message);     
    this.toSftpChannel.send(message);       
}       

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

    System.out.println("enter fileMessageSource....."+ source.receive());fileMessageSource() @Bean 中很糟糕,只是因为你在那里做source.receive()SOUT 不负责这样做。

    如果你能与我们分享一些关于此事的 StackTrace,那就更好了...

    还有一点:您在控制台中看到System.out.println("message....."+message); 的结果了吗?

    【讨论】:

    • 当我的本地目录中只有一个文件时,“消息”为空,但如果有多个文件,则只选择第二个文件并将其复制到远程目录然后停止加工。请找到相同的 StackTrace .....................输入 fileMessageSource .....GenericMessage [payload=D :\local_copy\SFTP.TXT, headers={timestamp=1436937421367, id=37994faa-236c-b64f-6390-f496bebb6a19}] 消息.....null。这次我只保留了一个文件,消息即将为空。
    • 嗨 Artem,我已经删除了 System.out.println("enter fileMessageSource....."+ source.receive());来自 fileMessageSource() 方法。现在第一个文件正在远程机器中复制,但其他文件没有被复制。我认为轮询器工作不正常但不确定。你能指点一下吗?
    • 这只是因为您的测试用例只关心第一个文件并退出。
    • 感谢 Artem,我可以在我的测试方法中的 while 循环中处理这个问题吗?像这样....@Test public void testSftpOutboundFlow() { while(!fileReadingResultChannel.equals(null)){ Message> message = this.fileReadingResultChannel.receive(60000); this.toSftpChannel.send(消息); } }
    • 是的,你可以。或者只需手动制作尽可能多的 fileReadingResultChannel.receive() 文件即可测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 2016-01-27
    相关资源
    最近更新 更多