【问题标题】:How to convert normal CrudRepository<T,ID> to ReactiveCrudRepository<T,ID>如何将普通 CrudRepository<T,ID> 转换为 ReactiveCrudRepository<T,ID>
【发布时间】:2020-03-06 22:28:13
【问题描述】:

我正在使用spring-data-jpaspring webflux。当我用ReactiveCrudRepository 扩展我的UserRepository 时。我收到以下错误:

org.springframework.dao.InvalidDataAccessApiUsageException: Reactive Repositories are not supported by DynamoDB. Offending repository is com.poc.crud.repository.EmployeeRepository!

如果我使用CrudRepository 扩展并使用Mono.just(data-from-db)Flux.just(data-from-db) 发送响应,那么一切都很好。

我的问题是,如何创建自定义泛型 ReactiveCrudRepository&lt;T,ID&gt; 以便所有 crud 方法都返回 Mono 和 Flux 对象。

【问题讨论】:

  • 由于错误提到 DynamoDB 不支持反应式。使用调节器存储库,您可以返回MonoFlux,但它只会被异步处理,它不是完全反应式的。响应式 DB 支持仅适用于小范围的 DB 产品,而不适用于阻塞访问的全部范围。
  • 谢谢,有一个响应式库r2dbc,但我仍然愿意从普通CrudRepository编写我自己的响应式实现
  • 你不能因为那是阻塞的。此外,您不想走上编写自己的反应式实现的道路。只要您在底层使用 JDBC,就无法创建反应式实现,您需要为此重新发明 R2DBC。
  • 如果我使用Mono.just() 包装数据库响应,这仍然是阻塞代码吗?
  • 是的,因为底层调用被阻塞。 JDBC 是阻塞的,不管你用反应类型包装了多少,它下面都是阻塞的。因此,如果没有适当的响应式驱动程序(如 R2DBC),代码仍然会阻塞。

标签: spring spring-boot spring-data-jpa spring-webflux project-reactor


【解决方案1】:

如果我使用 CrudRepository 扩展并使用 Mono.just(data-from-db) 和 Flux.just(data-from-db) 发送响应,那么 一切都很好。

哇哦——不,不是。您可能认为这一切都很好,但这会将阻塞网络调用引入反应链,一旦您有几个并行运行的调用,这将大大减慢速度。更糟糕的是,您创建了一个“看起来”反应式的方法,但实际上并非如此 - 通常称为“冒名顶替反应式方法”。

简而言之,不可能采用阻塞代码并使其具有反应性 - 将其包装在 Mono.just() 中是行不通的。该库必须从头开始异步构建。

坏消息是,据我所知,目前(2019 年 11 月)没有对 DynamoDB 的 ReactiveCrudRepository 存储库支持,所以如果你必须使用它,你会有点卡住。

消息是亚马逊现在确实提供了asynchronous client for DynamoDB,您可以通过调用Mono.fromFuture() 轻松地将CompleteableFuture 包装在Mono 中 - 这样您就可以使用它来保持被动,仍然有 DynamoDB 支持。

【讨论】:

  • 感谢您的回复。我还在 aws sdk 中寻找对 dynamodb 的响应式支持。
猜你喜欢
  • 1970-01-01
  • 2014-02-05
  • 2016-02-29
  • 2019-06-13
  • 2010-11-18
  • 2012-01-22
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
相关资源
最近更新 更多