Как обернуть синхронный метод, возвращающий void, в Mono‹Void›?

Я пытаюсь адаптировать метод deleteById репозитория postgresql, который возвращает void, чтобы вернуть Mono<Void>

репозиторий - это служба, которую я автоматически подключил, я использую ее так

repository.deleteById(id) со строковым идентификатором в качестве аргумента


person kamalhm    schedule 18.08.2020    source источник
comment
Как вы называете репозиторий?   -  person Puce    schedule 18.08.2020
comment
репозиторий - это служба, которую я автоматически подключил, я использую ее вот так repository.deleteById(id) со строковым идентификатором в качестве аргумента   -  person kamalhm    schedule 19.08.2020


Ответы (1)


Если вы хотите использовать реактивный стек, вам следует использовать spring-data-r2dbc, который предоставляет ReactiveCrudRepository и метод Mono<Void> deleteById(ID id).

Если по какой-то причине вам нужно использовать синхронный метод, вы можете обернуть вызов deleteById, используя Mono.fromRunnable

Mono.fromRunnable(() -> repository.deleteById(someId))

Однако этого следует избегать, потому что тогда вы не получите никаких преимуществ от использования реактивного стека.

person sawim    schedule 18.08.2020
comment
В зависимости от того, что нужно OP, R2DBC может быть достаточно, поскольку он обеспечивает достойную реализацию реактивного репозитория, но ему все еще очень не хватает функций (он не поддерживает отношения сущностей, встраивание и т. д.). - person Moira; 18.08.2020
comment
Вопрос заключался в том, является ли хорошей идеей использование реактивного стека с базой данных sql. Насколько я знаю, в настоящее время spring-r2dbc — лучший вариант для этого случая, и он становится лучше. В нем по-прежнему отсутствуют многие функции синхронного мира, но встроенная база данных уже поддерживается. - person sawim; 18.08.2020
comment
Спасибо, я мог бы обновить spring-data-r2dbc позже, но сейчас я хочу попытаться обернуть синхронный репозиторий (используя JPA) в реактивный. Кстати, чем отличается Mono.fromRunnable(() -> repository.deleteById(someId)) от использования Mono.create(sink -> failedKafkaRepository.deleteById(id))? Я нашел это вчера и не совсем уверен, достигнет ли он того же, что и Mono.fromRunnable - person kamalhm; 19.08.2020
comment
В реактивном программировании вам нужно отправить сигнал/событие следующему процессору, чтобы передать ему некоторые данные, ошибку или просто сообщить, что никакое значение не будет передано, чтобы он мог прекратить прослушивание. Если вы используете Mono.create, то ваша функция Callable получает sink, которую можно использовать для ручной отправки события. Дополнительную информацию можно найти в документации projectreactor.io/docs/core/release/api/reactor/core/publisher/ ;) - person sawim; 19.08.2020