2017-04-21 22 views
0

Citrusテストの一環として、SFTP経由でCSVファイルをサーバーにプッシュしたいと考えています。これは、Spring Integrationを使用して可能になるはずです。Citrus Framework - Spring統合を使用してSFTP経由でファイルをアップロード

Caused by: org.springframework.messaging.MessagingException: Failed to write to '/tmp/citrus/example.xml.writing' while uploading the file; nested exception is org.springframework.core.NestedIOException: failed to write file; nested exception is 2: No such file 
    at org.springframework.integration.file.remote.RemoteFileTemplate.sendFileToRemoteDirectory(RemoteFileTemplate.java:537) 
    at org.springframework.integration.file.remote.RemoteFileTemplate.lambda$send$0(RemoteFileTemplate.java:310) 
    ... 69 more 
Caused by: org.springframework.core.NestedIOException: failed to write file; nested exception is 2: No such file 
    at org.springframework.integration.sftp.session.SftpSession.write(SftpSession.java:158) 
    at org.springframework.integration.file.remote.session.CachingSessionFactory$CachedSession.write(CachingSessionFactory.java:228) 
    at org.springframework.integration.file.remote.RemoteFileTemplate.sendFileToRemoteDirectory(RemoteFileTemplate.java:509) 
    ... 70 more 
Caused by: 2: No such file 
    at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2873) 
:次の例外は、このような状況でスローされるSftpTransferIT.java

public class SftpTransferIT extends TestNGCitrusTestDesigner { 

    @Autowired 
    ChannelEndpoint sftpEndpoint; 

    @Test @Parameters("context") 
    @CitrusTest(name = "SftpTransferIT.sendFileByFTP") 
    public void sendFileByFTP(@Optional @CitrusResource TestContext context) { 

     final File file = new File("C:\\Temp\\example.xml"); 
     final org.springframework.messaging.Message<File> message = MessageBuilder.withPayload(file).build(); 
     Message ftpMessage = new ChannelMessageConverter().convertInbound(message,sftpEndpoint.getEndpointConfiguration(),context); 

     send(sftpEndpoint).message(ftpMessage); 

    } 
} 

シトラス-config.xmlの

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:citrus="http://www.citrusframework.org/schema/config" 
     xmlns:citrus-test="http://www.citrusframework.org/schema/testcase" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:int="http://www.springframework.org/schema/integration" 
     xmlns:int-sftp="http://www.springframework.org/schema/integration/sftp" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/integration/sftp http://www.springframework.org/schema/integration/sftp/spring-integration-sftp.xsd 
     http://www.citrusframework.org/schema/config http://www.citrusframework.org/schema/config/citrus-config.xsd 
     http://www.citrusframework.org/schema/testcase http://www.citrusframework.org/schema/testcase/citrus-testcase.xsd 
"> 

    <!-- Common settings --> 
    <context:property-placeholder location="classpath:citrus.properties"/> 

    <citrus:schema-repository id="schemaRepository"/> 

    <!-- SFTP component --> 
    <bean id="sftpSessionFactory" class="org.springframework.integration.file.remote.session.CachingSessionFactory"> 
     <constructor-arg ref="defaultSftpSessionFactory" /> 
    </bean> 

    <bean id="defaultSftpSessionFactory" 
      class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory"> 
     <property name="host" value="${sftp.host}"/> 
     <property name="privateKey" value="${sftp.private.keyfile}"/> 
     <property name="port" value="${sftp.port}"/> 
     <property name="user" value="${sftp.username}"/> 
     <property name="allowUnknownKeys" value="true"/> 
    </bean> 

    <int-sftp:outbound-channel-adapter id="sftpOutboundAdapter" 
             session-factory="sftpSessionFactory" 
             channel="inputChannel" 
             remote-filename-generator-expression="payload.getName()" 
             remote-directory="/tmp/citrus"> 
     <int-sftp:request-handler-advice-chain> 
      <int:retry-advice /> 
     </int-sftp:request-handler-advice-chain> 
    </int-sftp:outbound-channel-adapter> 

    <int:channel id="inputChannel"/> 

    <citrus:channel-endpoint id="sftpEndpoint" channel="inputChannel" /> 
</beans> 

:私は以下のコードを使用してしようとしてきました

私はシトラス経由でメッセージを送信する方法にエラーがあると思います。誰かがCitrus経由でorg.springframework.messaging.Messageを正しく送る方法について助言してもらえますか?

シトラスのsend()を使わずに純粋なSpring Integrationを使ってこのようなタスクを実行する方が良いでしょうか? use-temporary-file-name = "false"を設定するには、

答えて

0

試してみてください。

デフォルトでは、転送中であるすべてのファイルは、デフォルトでは、.writingで、追加の接尾辞を持つファイルシステムに表示されます。これはtemporary-file-suffix属性を使用して変更できます。

ただし、この方法を使用したくない場合があります(たとえば、サーバーでファイル名の変更が許可されていない場合など)。このような状況では、use-temporary-file-nameをfalse(デフォルトはtrue)に設定することで、この機能を無効にすることができます。この属性がfalseの場合、ファイルは最終的な名前で書き込まれ、消費するアプリケーションは、ファイルにアクセスする前にファイルが完全にアップロードされたことを検出する他のメカニズムが必要になります。

SFTPに実際に/tmp/citrusが存在することを確認してください。

関連する問題