【问题标题】:Listing files from ftp using spring-integration使用 spring-integration 从 ftp 列出文件
【发布时间】:2014-07-16 09:12:50
【问题描述】:

我想使用 spring-integration 列出 FTP 服务器上的所有文件,例如,在屏幕上打印它们。我做过这样的事情:

上下文:

<int:channel id="toSplitter">
    <int:interceptors>
        <int:wire-tap channel="logger"/>
    </int:interceptors>
</int:channel>

<int:logging-channel-adapter id="logger" log-full-message="true"/>
<int:splitter id="splitter" input-channel="toSplitter" output-channel="getFtpChannel"/>

<int-ftp:outbound-gateway id="gatewayLS"
                        session-factory="ftpClientFactory"
                        request-channel="inbound"
                        command="ls"
                        expression="payload"
                        reply-channel="toSplitter"/>
<int:channel id="getFtpChannel">
    <int:queue/>
</int:channel>
    <bean id="ftpClientFactory"
        class="org.springframework.integration.ftp.session.DefaultFtpSessionFactory">
    <property name="host" value="${host}"/>
    <property name="username" value="${user}"/>
    <property name="password" value="${password}"/>
    <property name="clientMode" value="0"/>
    <property name="fileType" value="2"/>
    <property name="bufferSize" value="10000000"/>                  
</bean>

Java 代码:

ConfigurableApplicationContext context = 
            new FileSystemXmlApplicationContext("/src/citrus/resources/citrus-context.xml");
final FtpFlowGateway ftpFlow = context.getBean(FtpFlowGateway.class);
ftpFlow.lsFiles("/");
PollableChannel channel = context.getBean("getFtpChannel", PollableChannel.class);
variable("tt", channel.receive().toString());
echo("${tt}");

输出:

11:09:17,169 INFO  port.LoggingReporter| Test action <echo>
11:09:17,169 INFO    actions.EchoAction| [Payload=FileInfo [isDirectory=false,  isLink=false, Size=3607, ModifiedTime=Tue Jul 15 14:18:00 CEST 2014,       Filename=Smoke03_angart30_st40.exi, RemoteDirectory=/, Permiss
ions=-rw-r--r--]][Headers= {replyChannel=org.springframework.integration.core.MessagingTemplate$TemporaryReplyChannel@7829b776, sequenceNumber=1,  errorChannel=org.springframework.integration.core.MessagingTempla
te$TemporaryReplyChannel@7829b776, file_remoteDirectory=/, sequenceSize=1, correlationId=49b57f2d-4dbf-4a89-b5b8-0dfb15bca2be, id=0a58ad65-74b4-4aae-87be- aa6034a41776, timestamp=1405501757060}]
11:09:17,169 INFO  port.LoggingReporter| Test action <echo> done
11:09:17,169 INFO  port.LoggingReporter| TEST STEP 1/1 done

输出很好,但是当我不知道 FTP 上存储了多少文件时,我应该怎么做才能打印这些信息? (此代码仅打印一个文件)。我试过检查 channel.receive() 是否为空,但测试只是冻结了。

【问题讨论】:

    标签: java ftp spring-integration


    【解决方案1】:

    由于您将LS 的结果发送到&lt;splitter&gt;,您的getFtpChannel 将一一收到FileInfo&lt;?&gt; 对象。

    要打印它们,你真的应该有一个无限循环:

    while (true) {
      variable("tt", channel.receive().toString());
      echo("${tt}");
    }
    

    要停止应用程序,您应该提供一些 shoutDownHook 或从控制台输入中监听某些内容。

    还有一点,用无限 receive() 阻止您的应用程序是不好的。 有一个重载方法,它应用timeout 参数。最后一个可能有助于确定循环的结束:

    while (true) {
      Message<?> receive = channel.receive(10000);
      if (receive == null) {
          break;
      }
      variable("tt", receive.toString());
      echo("${tt}");
    }
    

    【讨论】:

      【解决方案2】:
      @Configuration
      public class FtpConfig {
      
          @Bean
          public DefaultFtpSessionFactory ftpSessionFactory() {
              DefaultFtpSessionFactory ftpSessionFactory = new DefaultFtpSessionFactory();
              ftpSessionFactory.setHost("localhost");
              ftpSessionFactory.setPort(21);
              ftpSessionFactory.setUsername("user");
              ftpSessionFactory.setPassword("pass");
              return ftpSessionFactory;
          }
      
      }
      
      @Bean
      public ApplicationRunner runner(DefaultFtpSessionFactory sf) {
         return args -> {
             FTPFile[] list = sf.getSession().list(".");
             for (FTPFile file: list ) {
                 System.out.println("Result: " + file.getName());
             }
         };
      }
      

      【讨论】:

      • 请解释一下这堵文字墙的作用。就外行而言,它可能会教 OP 喊“Fus Ro Dah”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多