Spring 的 RemoteFileTemplate.get 方法是同步的吗?
Is Spring's RemoteFileTemplate.get method synchronous?
Spring的RemoteFileTemplate.get方法是同步的吗?
测试时,它似乎是同步的。检查实现时,它似乎也是同步的。而且我知道有理由使用同步回调而不是仅仅返回 InputStream
.
但是为什么文档对回调 synchronous/asynchronous 只字未提?我可以假设回调将在未来的版本中保持同步吗?
这背后的原因是我想确保调用阻塞直到回调被执行。例如,我希望以下代码会导致以下输出:
代码:
remoteFileTemplate.get(filePath, stream -> System.out.println("1"));
System.out.println(2);
输出:
1
2
而且我从不希望输出是:
2
1
逻辑是这样的:
try (InputStream inputStream = session.readRaw(remotePath)) {
callback.doWithInputStream(inputStream);
return session.finalizeRaw();
}
关闭InputStream
并释放远程资源。这里的 callback
只是一个 end-user 挂钩,用于接受远程文件数据流。由于会话未共享,因此没有任何 multi-threaded 问题。
当然我们不能保证所提供的InputStreamCallback
impl是thread-safe。尽管当您将 inputStream
交给该回调中的其他线程时,它将关闭并释放会话。因此,您的其他线程将受到 out-dated InputStream
引用的影响。
我不确定您对回调有何担忧,因为这不是框架的作用。当您调用此 get(String remotePath, InputStreamCallback callback)
.
时,您提供了它的含义
Spring的RemoteFileTemplate.get方法是同步的吗?
测试时,它似乎是同步的。检查实现时,它似乎也是同步的。而且我知道有理由使用同步回调而不是仅仅返回 InputStream
.
但是为什么文档对回调 synchronous/asynchronous 只字未提?我可以假设回调将在未来的版本中保持同步吗?
这背后的原因是我想确保调用阻塞直到回调被执行。例如,我希望以下代码会导致以下输出:
代码:
remoteFileTemplate.get(filePath, stream -> System.out.println("1"));
System.out.println(2);
输出:
1
2
而且我从不希望输出是:
2
1
逻辑是这样的:
try (InputStream inputStream = session.readRaw(remotePath)) {
callback.doWithInputStream(inputStream);
return session.finalizeRaw();
}
关闭InputStream
并释放远程资源。这里的 callback
只是一个 end-user 挂钩,用于接受远程文件数据流。由于会话未共享,因此没有任何 multi-threaded 问题。
当然我们不能保证所提供的InputStreamCallback
impl是thread-safe。尽管当您将 inputStream
交给该回调中的其他线程时,它将关闭并释放会话。因此,您的其他线程将受到 out-dated InputStream
引用的影响。
我不确定您对回调有何担忧,因为这不是框架的作用。当您调用此 get(String remotePath, InputStreamCallback callback)
.