Является ли метод Spring RemoteFileTemplate.get синхронным? - PullRequest
0 голосов
/ 03 августа 2020

Является ли метод Spring RemoteFileTemplate.get синхронным?

При тестировании он выглядит синхронным. При проверке реализации тоже вроде синхронно. И я понимаю, что есть причина использовать синхронный обратный вызов вместо того, чтобы просто возвращать InputStream.

Но почему в документации ничего не говорится о том, что обратный вызов является синхронным / асинхронным? Могу ли я предположить, что обратный вызов останется синхронным в будущих выпусках?

Причина в том, что я хочу убедиться, что вызов блокируется до тех пор, пока обратный вызов не будет выполнен. В примере я ожидаю, что следующий код приведет к следующему выводу:

Код:

remoteFileTemplate.get(filePath, stream -> System.out.println("1"));
System.out.println(2);

Вывод:

1
2

И я никогда не хочу, чтобы вывод был :

2
1

1 Ответ

0 голосов
/ 03 августа 2020

Лог c выглядит так:

try (InputStream inputStream = session.readRaw(remotePath)) {
    callback.doWithInputStream(inputStream);
    return session.finalizeRaw();
}

, чтобы закрыть InputStream и освободить удаленные ресурсы. Здесь callback - это просто перехватчик конечного пользователя для приема этого потока данных удаленного файла. Нет никаких проблем с многопоточностью, поскольку сеанс не используется совместно.

Конечно, мы не можем гарантировать, что предоставленный InputStreamCallback impl является потокобезопасным. Хотя когда вы передаете этот inputStream другому потоку в этом обратном вызове, он будет закрыт и сеанс будет освобожден. Следовательно, ваш другой поток будет страдать от устаревшей ссылки InputStream.

Я не уверен, что вас беспокоит по поводу обратного вызова, поскольку это не то, что делает структура. Вы предоставляете это значение, когда звоните по этому номеру get(String remotePath, InputStreamCallback callback).

...