Warm tip: This article is reproduced from serverfault.com, please click

java-@Autowired时,SftpRemoteFileTemplate不能与RemoteDirectoryExpression一起使用

(java - SftpRemoteFileTemplate does not work with RemoteDirectoryExpression when @Autowired)

发布于 2020-11-27 09:32:28

以下是我正在使用的配置

@Autowired
private SftpRemoteFileTemplate outboundTemplate;

@Autowired
private SftpConfig config;


@Bean
@ServiceActivator(inputChannel = "sftpOutputGenericChannel")
public MessageHandler simplehandler() {
    SftpMessageHandler handler = new SftpMessageHandler(outboundTemplate, FileExistsMode.APPEND);
    handler.setRemoteDirectoryExpression(new LiteralExpression(config.getDirectory()));
    handler.setFileNameGenerator((Message<?> message) -> ((String) message.getHeaders().get(KEY)));
    handler.setUseTemporaryFileName(false);
    return handler;
}

我在单独的Config类中创建了Sessionfactory,CachingSessionfactory和SftpRemoteFileTemplte,并且它们已正确实例化,以下是相同的日志。

2020-11-27 01:15:17.742 [main] o.s.b.f.s.DefaultListableBeanFactory     : Creating shared instance of singleton bean 'cachingSessionFactory'
2020-11-27 01:15:17.744 [main] o.s.b.f.s.DefaultListableBeanFactory     : Creating shared instance of singleton bean 'sftpSessionFactory'
2020-11-27 01:15:17.778 [main] o.s.b.f.s.DefaultListableBeanFactory     : Autowiring by type from bean name 'cachingSessionFactory' via factory method to bean named 'sftpSessionFactory'
2020-11-27 01:15:17.783 [main] o.s.integration.util.SimplePool          : Target pool size changed by -2147483637, now 10
2020-11-27 01:15:54.434 [main] o.s.b.f.s.DefaultListableBeanFactory     : Creating shared instance of singleton bean 'outboundTemplate'
2020-11-27 01:15:54.435 [main] o.s.b.f.s.DefaultListableBeanFactory     : Autowiring by type from bean name 'outboundTemplate' via factory method to bean named 'cachingSessionFactory'

当我执行此代码时,Spring DEBUG日志显示文件已成功发送到服务器,但实际上文件并未上载到服务器。

但是如果我将的实现更改MessageHandler

SftpMessageHandler handler = new SftpMessageHandler(new SftpRemoteFileTemplate(cachingSessionFactory), FileExistsMode.APPEND);

它开始工作,文件实际上已上传到服务器,不确定为什么会发生这种情况吗?

当我@Autowired SftpRemoteFileTemplatehandler.setRemoteDirectoryExpressionString("headers['remote_directory']")它一起使用时可以再观察一次

我想了解SftpRemoteTemplate在这里如何工作,建议的最佳做法是什么?

注意:SpringBoot v2.4.0 Spring集成:5.4.1,面对引导v2.2.6.RELEASE的类似问题

Questioner
Pratik Dhole
Viewed
11
Artem Bilan 2020-12-01 00:22:46

你可能SftpRemoteFileTemplate在其他地方使用了相同的名称,并且还在其他地方对其进行了修改。实际上handler.setRemoteDirectoryExpression(),对提供的对象进行了委派,因此发生了变化SftpRemoteFileTemplate

/**
 * Specify a remote directory path SpEL expression.
 * @param remoteDirectoryExpression the remote directory expression
 * @see RemoteFileTemplate#setRemoteDirectoryExpression(Expression)
 */
public void setRemoteDirectoryExpression(Expression remoteDirectoryExpression) {
    this.remoteFileTemplate.setRemoteDirectoryExpression(remoteDirectoryExpression);
}

因此,当另一个地方进行类似的修改时,你最终会遇到争用情况,并且你的文件可能会转移到另一个地方。

最佳做法是将aRemoteFileTemplate视为a,prototype并且每个通道适配器都有一个实例。或仅使用另一个ctor-仅SessionFactory基于-:

/**
 * @param sessionFactory the session factory.
 * @see FileTransferringMessageHandler#FileTransferringMessageHandler
 * (SessionFactory)
 */
public SftpMessageHandler(SessionFactory<LsEntry> sessionFactory)

我们可能需要修改的逻辑,FileTransferringMessageHandler以拒绝外部提供的突变RemoteFileTemplate随时提出GH问题,我们将在下一个主要版本中看到可以做什么,在该版本中我们可以进行一些重大更改。