Синхронизированный метод в Spring WebFlux? - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь сохранить класс singleton, и я хотел бы убедиться, что он остается единичным. Как правильно синхронизировать вызовы методов в Spring WebFlux?

У меня есть следующий метод обслуживания:

public Mono<SingletonClass> saveOrUpdate(SingletonClass singletonClass) {
    return this.getTheSingletonClass().map(someLogicAndSave).switchIfEmpty(singletonClassRepository.save(singletonClass);
}

Должен ли я добавить синхронизированное ключевое слово в метод saveOrUpdate?

1 Ответ

0 голосов
/ 14 января 2019
  • В: Синхронизированный метод в Spring WebFlux? (Или любой моно / флюс)
  • A: Если можете, то найдите лучшее решение. Прежде всего, не используйте ключевое слово синхронизации при написании с реактором проекта. Посмотрите на каждую функцию как на небольшую часть потока. Project Reactor предоставляет вам инструменты, которые лучше контролируют потоки, которые вы пытаетесь синхронизировать. Намного лучше контролировать. Во-вторых, вы не должны синхронизировать что-либо, если вы не изменяете что-то (что вы должны делать главным образом в целях оптимизации). Реагирование на программирование - это в основном обратные вызовы; когда кто-то хочет получить результат задачи, она будет запущена, а когда задача будет завершена, кто-то (не вы) вызовет функцию, которую вы предоставили с результатом задачи в качестве параметра. Синхронизация означает ожидание завершения потока, чтобы сделать что-то, так что другой поток может сделать то же самое. попытайтесь выяснить, можете ли вы изменить свою действительную логику, чтобы она была неизменной, чтобы несколько потоков могли выполнять эту логику одновременно. Если нет, то продолжайте читать.

При вызове saveOrUpdate вы получаете Mono, который представляет результат задачи. фактический результат будет там только тогда, когда кто-то подпишется на задание (=== Моно, которое вы получили от вызова функции saveOrUpdate). Другими словами, saveOrUpdate возвращает описание потока === что должен делать поток (сверху донизу), когда кто-то выдвигает новое значение в верхней части потока.

  • В: Должен ли я добавить синхронизированное ключевое слово в метод saveOrUpdate?
  • A: Нет. Как вывод из приведенного выше объяснения, многократный вызов saveOrUpdate ничего не даст, кроме создания и возврата описаний потоков. Методы, которые должны (возможно) быть синхронизированными, являются методами, которые действительно что-то мутируют и могут вызываться одновременно из нескольких потоков.

К настоящему времени у вас есть базовые знания о том, что такое поток. Следующим шагом является изучение многопоточности в Project Reactor (библиотека Mono / Flux).

  • Q: Какой метод синхронизации вызовов методов в Spring WebFlux является правильным?
  • A: Я не уверен, что понимаю, что именно вы имеете в виду. Этот вопрос все еще актуален после всего, что я объяснил? Если да, попробуйте перефразировать его (отредактируйте вопрос).

Примечания:

Оценка выражений в потоках:

Вы должны внимательно посмотреть на выражение: singletonClassRepository.save(singletonClass) в вашем примере. Поток должен выполняться только тогда, когда кто-то подписывается на него. В вашем примере этот фрагмент кода является выражением, которое может и будет вычисляться при выполнении метода saveOrUpdate. В результате часть потока исполняется даже до того, как кто-то подписывается на него (singletonClassRepository.save(singletonClass), а остальная часть потока будет выполняться только тогда, когда кто-то подписывается на него.

Это не плохой дизайн. Но если singletonClassRepository.save(singletonClass) выполняет какую-то мутацию, вам следует рассмотреть возможность синхронизации метода saveOrUpdate.

Как синхронизировать

Синхронизируйте только с одним из инструментов, которые Project Reactor обеспечивает: concatMap, flatMap и т. Д.

...