2013-12-12 2 views
1

Я использую mule для обработки файлов из sftp, но мне нужно обработать файл по порядку (последовательность упорядочена по имени файла).
Например: есть 3 файла в SFTP:
1.txt, 2.txt, 3.txt
мне нужно обработать эти три файла по одному и должны в порядке имя файла (первый. обрабатывать 1.txt, затем 2.txt, наконец, 3.txt)
Я использую служебные переопределения в коннекторе и расширяю SftpMessageReceiver и переопределяю метод poll(), в методе я создаю эти файлы по порядку. Но это не работает. Кто может сказать мне, где не так.
класс я пишу
Mule ESB: добавить <service-overrides messageReceiver = "myReceiver"> в sftp разъем не работает

public class NewSftpMessageReceiver extends SftpMessageReceiver { 
private SftpReceiverRequesterUtil sftpRRUtil = null; 


public NewSftpMessageReceiver(SftpConnector connector, 
           FlowConstruct flow, 
           InboundEndpoint endpoint, 
           long frequency) throws 
               CreateException { 
    super(connector, flow, endpoint); 


    this.setFrequency(frequency); 


    sftpRRUtil = new SftpReceiverRequesterUtil(endpoint); 
} 


public NewSftpMessageReceiver(SftpConnector connector, FlowConstruct flow, InboundEndpoint endpoint) 
     throws 
     CreateException { 
    super(connector, flow, endpoint); 
    sftpRRUtil = new SftpReceiverRequesterUtil(endpoint); 
} 


@Override 
public void poll() throws 
        Exception { 
    try { 
     String[] files = sftpRRUtil.getAvailableFiles(false); 

     //do something here..... 
     for (String file : files) { 
      if (getLifecycleState().isStopping()) { 
       break; 
      } 
      routeFile(file); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

}

конфигурационный файл, как показано ниже

<sftp:connector name="incoming-mandate-connector" 
       archiveDir="${esb.archive.path}/mandate/incoming" 
       useTempFileTimestampSuffix="true" 
       autoDelete="true" 
       identityFile="${esb.incoming.sftp.identityFile}" 
       passphrase="${esb.incoming.sftp.passphrase}" 
       sizeCheckWaitTime="${esb.incoming.sftp.sizeCheckWaitTime}"> 
    <service-overrides messageReceiver="com.xxy.NewSftpMessageReceiver"/>   
</sftp:connector> 


<sftp:endpoint name="incoming-mandate-ep" 
       address="${esb.incoming.connector}" 
       connector-ref="incoming-mandate-connector" 
       keepFileOnError="true" encoding="${esb.encoding}"> 
    <file:filename-wildcard-filter pattern="${esb.incoming.filePattern}"/> 
</sftp:endpoint> 

поток, как взрывали

<flow name="process"> 


    <quartz:inbound-endpoint name="quartz-endpoint" cronExpression="${esb.cronExpression}" jobName="incoming-mandate-job"> 
     <quartz:endpoint-polling-job> 
      <quartz:job-endpoint ref="incoming-mandate-ep"/> 
     </quartz:endpoint-polling-job> 
    </quartz:inbound-endpoint> 



    <processor ref="mandate-processor"/> 
    <transformer ref="mandate-transformer"/> 
    <mulexml:jaxb-object-to-xml-transformer jaxbContext-ref="jaxb" name="mandate-jaxb-transformer"/> 
    <byte-array-to-string-transformer mimeType="application/xml"/> 

    <message-properties-transformer scope="outbound"> 
     <add-message-property key="${esb.username}" value="${esb.password}"/> 
    </message-properties-transformer> 
    <outbound-endpoint ref= "mandate-service-ep"/> 
</flow> 
+0

Может ли вы отправить полную конфигурацию? Также добавьте регистратор в пользовательский приемник, чтобы узнать, вызвано ли оно или нет. – Seba

+0

Я попытался добавить регистратор в приемник custome, но нет печати журнала (я имею в виду, что он не вызывается). Я не знаю, где я ошибаюсь. (Я использую mule3.2.0) – xxy

+0

Все еще отсутствует конфигурация. – Seba

ответ

1

Причина, почему ваше сообщение приемник не называется потому что у вас есть конечная точка кварца, которая вызывает транспорт SFTP, поэтому на самом деле вы используете реквестер сообщений, а не получатель.

Вы должны были бы создать пользовательское сообщение запрашивающего вместо приемник, а также пользовательский реквестер завод (который создает экземпляры запрашивающего)

Вы можете настроить его следующим образом:

<sftp:connector name="sftpConnector"> 
<spring:property name="serviceOverrides"> 
<spring:map> 
<spring:entry key="requester.factory" value="your.package.YourCustomSftpRequesterFactory"/> 
</spring:map> 
</spring:property> 
</ftp:connector> 
+0

, но в коннекторе он не позволяет мне определить реквестера. не поддерживается :( – xxy

+0

Отредактировал свой ответ, чтобы его охватить. – Seba

+0

большое спасибо .Темно я попробую это;) – xxy

Смежные вопросы