2016-05-10 6 views
1

Ich unterhalte eine vorhandene Spring Integration-Anwendung, die einen Fremdanbieter-SFTP-Server nach Dateien abfragt. Gelegentlich wird die Berechtigung oder "nicht gefunden" -Fehler ausgelöst, was vermutlich auf vorübergehende Probleme am entfernten Ende zurückzuführen ist. Ich möchte, dass die Anwendung diese Fehler erneut versucht, da das Problem dadurch möglicherweise behoben wird. (Ich habe auch eine Anforderung, "bei irgendwelchen Problemen erneut zu versuchen", was diesen Fall abdecken sollte.)Retry on SFTP Permission error

z.B.

org.springframework.messaging.MessagingException: Problem occurred while synchronizing remote to local directory; nested exception is org.springframework.messaging.MessagingException: Failure occurred while copying from remote to local directory; nested exception is org.springframework.core.NestedIOException: failed to read file mypath/myfile.csv; nested exception is 3: Permission denied 
at [snip] 
Caused by: org.springframework.messaging.MessagingException: Failure occurred while copying from remote to local directory; nested exception is org.springframework.core.NestedIOException: failed to read file mypath/myfile.csv; nested exception is 3: Permission denied 
at [snip] 
Caused by: 3: Permission denied 
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2846) [snip] 

Nach umfangreichen googeln und im Kreis gehen, bin ich immer noch nicht in der Lage, herauszufinden, wie dies mit Frühling Integration zu tun. Hier ist die bestehende config:

<bean id="myAcceptOnceFilter" class="org.springframework.integration.sftp.filters.SftpPersistentAcceptOnceFileListFilter"> 
    <constructor-arg index="0" ref="myLocalFileStore"/> 
    <constructor-arg index="1" name="prefix" value="myprefix_"/> 
    <property name="flushOnUpdate" value="true"/> 
</bean> 

<bean id="myCompositeFilter" class="org.springframework.integration.file.filters.CompositeFileListFilter"> 
    <constructor-arg> 
     <list> 
      <bean class="org.springframework.integration.sftp.filters.SftpSimplePatternFileListFilter"> 
       <constructor-arg value="myprefix" /> 
      </bean> 
      <ref bean="myAcceptOnceFilter"/> 
     </list> 
    </constructor-arg> 
</bean> 

<int-sftp:inbound-channel-adapter id="myInboundChannel" 
      session-factory="mySftpSessionFactory" 
      channel="myDownstreamChannel" 
      remote-directory="blah" 
      filter="myCompositeFilter" 
      local-directory="blah" 
      auto-create-local-directory="true" 
      > 
    <int:poller fixed-rate="10000" max-messages-per-poll="-1"> 
     <int:transactional transaction-manager="transactionManager" synchronization-factory="syncFactory" /> 
    </int:poller> 
</int-sftp:inbound-channel-adapter> 

EDIT: Ich denke, das Problem in myCompositeFilter liegt. Es sieht nicht so aus, als ob rollback() in myAcceptOnceFilter aufgerufen wird, wenn die Ausnahme ausgelöst wird. Wenn ich einfach myAcceptOnceFilter ohne das Composite verwende, funktioniert der Code wie vorgesehen (d. H. Rollback() wird aufgerufen). Frage ist jetzt: Wie verwende ich weiterhin einen CompositeFilter, der Rollback für alle seine Kinder aufruft?

Ich habe einen Wiederholungs Adapter innerhalb des pollers in Putten sehe (EDIT: Ich weiß jetzt, dies irrelevant ist):

<bean id="retryAdvice" class="org.springframework.integration.handler.advice.RequestHandlerRetryAdvice"/> 

<int:poller fixed-rate="10000" max-messages-per-poll="-1"> 
    <int:advice-chain> 
     <tx:advice transaction-manager="transactionManager"/> 
     <int:ref bean="retryAdvice"/> 
    </int:advice-chain> 
</int:poller> 

... aber dies eine Warnung wirft dass

This advice org.springframework.integration.handler.advice.RequestHandlerRetryAdvice can only be used for MessageHandlers 

Kurz gesagt, ich stecke fest. Jede Hilfe, die versucht, es bei dieser Art von sftp-Ausnahme erneut zu versuchen, wäre sehr dankbar. Vielen Dank!

EDIT: Hinzugefügt in Erwähnung von SftpPersistentAcceptOnceFileListFilter. EDIT: Diskussion von CompositeFileLIstFilter hinzugefügt, die jetzt wie der Ort des Problems aussieht.

Antwort

1

Der Wiederholungsvorschlag bezieht sich auf Endpunkte (Push-Retry).

Es ist nicht klar, warum Sie einen erneuten Versuch hier hinzufügen müssen - der Poller wird von sich aus bei der nächsten Abfrage erneut versuchen.

+0

Danke für die Antwort - fairer Punkt. myFilter oben enthält SftpPersistentAcceptOnceFileListFilter (wird bearbeitet, um dies zu erwähnen); Wenn ich das entferne, bekomme ich das Wiederholungsverhalten wie beschrieben. Vielleicht sollte meine Frage sein, wie man die Datei im PropertiesPersistingMetadataStore bei den ersten paar fehlgeschlagenen Versuchen nicht als heruntergeladen markiert. – Liche

+0

OK Ich habe hier schon lange gegraben, und ich denke, das Problem besteht darin, dass CompositeFileListFilter aus irgendeinem Grund kein Rollback für alle seine Composites aufruft. nicht sicher, wie dies zu beheben, über die Implementierung einer benutzerdefinierten FileListFilter-Klasse hinaus, Hinweise begrüßt. – Liche

+0

Welche Version von Spring Integration verwenden Sie? Der 'CompositeFileListFilter' wurde in [4.2.1 und 4.1.7] reversibel gemacht (https://github.com/spring-projects/spring-integration/pull/1579). –