同步工厂删除sftp:inbound-channel-adapter的文件夹

时间:2018-10-19 13:27:36

标签: java spring-integration

我遇到这样的问题:第一次处理此代码,效果很好,但是第二次(第一次和第二次运行基于设置的cron),它在失败的文件夹中查找文件,然后删除成功文件夹并将其复制到失败文件夹。我不知道为什么会这样?

<int-sftp:inbound-channel-adapter
    id="sftpInboundAdapter" 
    session-factory="sftpSessionFactory"
    remote-directory="${remote}"
    local-directory="${local.download.folder}"
    delete-remote-files="false"
    channel="InboundChannel"
    filter="CompositeIncomingFilesFilter"
    auto-startup="true">
    <int:poller cron="*/60 * * * * ?" error-channel="PollerErrorChannel">
        <int:transactional transaction-manager="transactionManager" synchronization-factory="syncFactory" />
    </int:poller>
</int-sftp:inbound-channel-adapter>

<bean id="transactionManager" class="org.springframework.integration.transaction.PseudoTransactionManager" />

<int:transaction-synchronization-factory id="syncFactory" >
    <int:after-commit expression="payload.renameTo(new java.io.File('${local.download.folder}' + 'success/' + payload.name))" channel="afterCommitSuccessChannel" />
    <int:after-rollback expression="payload.renameTo(new java.io.File('${local.download.folder}' + 'failed/' + payload.name))" channel="afterRollbackFailedChannel" />
</int:transaction-synchronization-factory>

<int:channel id="afterCommitSuccessChannel" />
<int:channel id="afterRollbackFailedChannel" />

<int:logging-channel-adapter id="afterCommitSuccessChannel" expression="'File saved and processed: ' + payload"  level="INFO" />
<int:logging-channel-adapter id="afterRollbackFailedChannel" expression="'File was rollbacked: ' + payload"  level="INFO" />

<bean id="CompositeIncomingFilesFilter" class="org.springframework.integration.file.filters.CompositeFileListFilter">
    <constructor-arg>
        <list>
            <bean id="SftpFilterAlreadyDownloadedFiles" class="org.springframework.integration.sftp.filters.SftpPersistentAcceptOnceFileListFilter">
                <constructor-arg index="0" ref="persistingMetadataStore" />
                <constructor-arg index="1" value="prefix_" />
                <property name = "flushOnUpdate" value = "true"/>
            </bean>         
            <bean id="SftpFilterSimple" class="org.springframework.integration.sftp.filters.SftpSimplePatternFileListFilter">
                <constructor-arg index="0" value="*123*.txt" />
            </bean>
        </list>
    </constructor-arg>      
</bean>

我的日志显示以下内容:

    2018-10-23 11:29:04.597  INFO 12244 --- [ask-scheduler-2] o.s.integration.handler.LoggingHandler   : File saved and processed: true
File saved and processed: true
2018-10-23 11:30:00.002  INFO 12244 --- [ask-scheduler-4] o.s.i.file.FileReadingMessageSource      : Created message: [GenericMessage [payload=\local\failed, headers={id=6afc5dfb-5dd4-b234-5c35-a60a42931524, timestamp=1540287000002}]]
Created message: [GenericMessage [payload=\local\failed, headers={id=6afc5dfb-5dd4-b234-5c35-a60a42931524, timestamp=1540287000002}]]
2018-10-23 11:30:00.023 ERROR 12244 --- [ask-scheduler-4] i.a.ErrorMessageLoggerActivator          : Message containing error inside channel: GenericMessage [payload=\local\failed, headers={id=6afc5dfb-5dd4-b234-5c35-a60a42931524, timestamp=1540287000002}]
Message containing error inside channel: GenericMessage [payload=\local\failed, headers={id=6afc5dfb-5dd4-b234-5c35-a60a42931524, timestamp=1540287000002}]
2018-10-23 11:30:00.023 ERROR 12244 --- [ask-scheduler-4] i.a.ErrorMessageLoggerActivator          : ErrorMessageLoggerActivator exception: 
ErrorMessageLoggerActivator exception: 
2018-10-23 11:30:17.180  WARN 12244 --- [ask-scheduler-4] sftpInboundLogger                : \local\failed
\local\failed
2018-10-23 11:30:17.192  INFO 12244 --- [ask-scheduler-4] o.s.integration.handler.LoggingHandler   : File was rollbacked: false
File was rollbacked: false
2018-10-23 11:30:17.193 ERROR 12244 --- [ask-scheduler-4] i.e.InboundStreamErrorHandler            : java.io.FileNotFoundException: \local\failed (Access is denied)
java.io.FileNotFoundException: \local\failed (Access is denied)
2018-10-23 11:31:00.001  INFO 12244 --- [ask-scheduler-5] o.s.i.file.FileReadingMessageSource      : Created message: [GenericMessage [payload=\local\success, headers={id=4e12f55a-2b2a-ca79-fad3-1325b7b698fa, timestamp=1540287060001}]]
Created message: [GenericMessage [payload=\local\success, headers={id=4e12f55a-2b2a-ca79-fad3-1325b7b698fa, timestamp=1540287060001}]]
2018-10-23 11:31:00.022  WARN 12244 --- [ask-scheduler-5] sftpInboundLogger                : \local\success
\local\success
2018-10-23 11:31:00.032  INFO 12244 --- [ask-scheduler-5] o.s.integration.handler.LoggingHandler   : File was rollbacked: true
File was rollbacked: true
2018-10-23 11:31:00.034 ERROR 12244 --- [ask-scheduler-5] i.a.ErrorMessageLoggerActivator          : Message containing error inside channel: ErrorMessage [payload=org.springframework.integration.transformer.MessageTransformationException: Failed to transform Message; nested exception is org.springframework.messaging.MessagingException: failed to transform File Message; nested exception is java.io.FileNotFoundException: \local\success (Access is denied), failedMessage=GenericMessage [payload=\local\success, headers={id=4e12f55a-2b2a-ca79-fad3-1325b7b698fa, timestamp=1540287060001}], failedMessage=GenericMessage [payload=\local\success, headers={id=4e12f55a-2b2a-ca79-fad3-1325b7b698fa, timestamp=1540287060001}], headers={id=9ac1bff3-2296-6166-115e-1e6fbc2ed304, timestamp=1540287060033}]
Message containing error inside channel: ErrorMessage [payload=org.springframework.integration.transformer.MessageTransformationException: Failed to transform Message; nested exception is org.springframework.messaging.MessagingException: failed to transform File Message; nested exception is java.io.FileNotFoundException: \local\success (Access is denied), failedMessage=GenericMessage [payload=\local\success, headers={id=4e12f55a-2b2a-ca79-fad3-1325b7b698fa, timestamp=1540287060001}], failedMessage=GenericMessage [payload=\local\success, headers={id=4e12f55a-2b2a-ca79-fad3-1325b7b698fa, timestamp=1540287060001}], headers={id=9ac1bff3-2296-6166-115e-1e6fbc2ed304, timestamp=1540287060033}]
2018-10-23 11:31:00.043 ERROR 12244 --- [ask-scheduler-5] i.a.ErrorMessageLoggerActivator          : ErrorMessageLoggerActivator exception: 

org.springframework.integration.transformer.MessageTransformationException: Failed to transform Message; nested exception is org.springframework.messaging.MessagingException: failed to transform File Message; nested exception is java.io.FileNotFoundException: \local\success (Access is denied), failedMessage=GenericMessage [payload=\local\success, headers={id=4e12f55a-2b2a-ca79-fad3-1325b7b698fa, timestamp=1540287060001}]
    at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:95)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:109)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127)
    at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:148)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:121)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:89)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:425)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:375)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105)
    at org.springframework.integration.endpoint.SourcePollingChannelAdapter.handleMessage(SourcePollingChannelAdapter.java:210)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:272)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.access$000(AbstractPollingEndpoint.java:58)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:190)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:186)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
    at com.sun.proxy.$Proxy130.call(Unknown Source)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller$1.run(AbstractPollingEndpoint.java:353)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor$1.run(ErrorHandlingTaskExecutor.java:55)
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:51)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.run(AbstractPollingEndpoint.java:344)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.messaging.MessagingException: failed to transform File Message; nested exception is java.io.FileNotFoundException: \local\success (Access is denied)
    at org.springframework.integration.file.transformer.AbstractFilePayloadTransformer.transform(AbstractFilePayloadTransformer.java:101)
    at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:89)
    ... 43 common frames omitted
Caused by: java.io.FileNotFoundException: \local\success (Access is denied)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at org.springframework.util.FileCopyUtils.copyToByteArray(FileCopyUtils.java:92)
    at org.springframework.integration.file.transformer.FileToByteArrayTransformer.transformFile(FileToByteArrayTransformer.java:32)
    at org.springframework.integration.file.transformer.FileToByteArrayTransformer.transformFile(FileToByteArrayTransformer.java:28)
    at org.springframework.integration.file.transformer.AbstractFilePayloadTransformer.transform(AbstractFilePayloadTransformer.java:87)
    ... 44 common frames omitted

ErrorMessageLoggerActivator exception: 
org.springframework.integration.transformer.MessageTransformationException: Failed to transform Message; nested exception is org.springframework.messaging.MessagingException: failed to transform File Message; nested exception is java.io.FileNotFoundException: \local\success (Access is denied), failedMessage=GenericMessage [payload=\local\success, headers={id=4e12f55a-2b2a-ca79-fad3-1325b7b698fa, timestamp=1540287060001}]
    at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:95)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:109)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127)
    at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:148)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:121)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:89)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:425)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:375)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105)
    at org.springframework.integration.endpoint.SourcePollingChannelAdapter.handleMessage(SourcePollingChannelAdapter.java:210)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:272)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.access$000(AbstractPollingEndpoint.java:58)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:190)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:186)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
    at com.sun.proxy.$Proxy130.call(Unknown Source)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller$1.run(AbstractPollingEndpoint.java:353)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor$1.run(ErrorHandlingTaskExecutor.java:55)
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:51)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.run(AbstractPollingEndpoint.java:344)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.messaging.MessagingException: failed to transform File Message; nested exception is java.io.FileNotFoundException: \local\success (Access is denied)
    at org.springframework.integration.file.transformer.AbstractFilePayloadTransformer.transform(AbstractFilePayloadTransformer.java:101)
    at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:89)
    ... 43 common frames omitted
Caused by: java.io.FileNotFoundException: \local\success (Access is denied)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at org.springframework.util.FileCopyUtils.copyToByteArray(FileCopyUtils.java:92)
    at org.springframework.integration.file.transformer.FileToByteArrayTransformer.transformFile(FileToByteArrayTransformer.java:32)
    at org.springframework.integration.file.transformer.FileToByteArrayTransformer.transformFile(FileToByteArrayTransformer.java:28)
    at org.springframework.integration.file.transformer.AbstractFilePayloadTransformer.transform(AbstractFilePayloadTransformer.java:87)
    ... 44 common frames omitted

1 个答案:

答案 0 :(得分:0)

  

然后将失败的文件移动到文件夹中

好。因此,当您将/success目录重命名为其他目录时,该目录将消失,并且当然不能再写入/success。您必须在将文件写入其中的建议中创建它。如果您无法控制在写入文件之前创建的/success目录,则需要考虑分别重命名每个文件。