3 java imperative reactive quarkus
你好,我正在阅读以下文章Quarkus 反应式架构
\n文章开头说
\n\n\n夸库斯是反应性的。它\xe2\x80\x99s 甚至比这更重要:Quarkus 统一了反应式和命令式编程。您甚至不必选择:您可以实现反应式组件和命令式组件,然后将它们组合在同一个应用程序中。
\n
就在文章的中间下方提到
\n\n\n借助代码中的提示(例如 @Blocking 和 @NonBlocking 注释),Quarkus 扩展可以决定应用程序逻辑何时阻塞或非阻塞。
\n
我的问题是我写反应式还是命令式重要吗?例如
\n反应式方法
\n @GET\n public Uni<List<Fruit>> get() {\n return sf.withTransaction((s,t) -> s\n .createNamedQuery("Fruits.findAll", Fruit.class)\n .getResultList()\n );\n }\nRun Code Online (Sandbox Code Playgroud)\n命令式方法
\n @GET\n @NonBlocking\n public List<Fruit> get() {\n return entityManager.createNamedQuery("Fruits.findAll", Fruit.class)\n .getResultList();\n }\nRun Code Online (Sandbox Code Playgroud)\n这两个代码片段运行时是否具有相同的反应性优势?
\n假设您的第二个片段使用经典的阻塞 Hibernate ORM,它不会像第一个片段(似乎使用 Hibernate Reactive)那样工作。它包含一个阻塞调用,因此您将阻塞事件循环,这是在非阻塞架构中可以做的最糟糕的事情,因为它基本上违背了非阻塞架构可以给您带来的所有好处(请参阅https : //vertx.io/docs/vertx-core/java/#golden_rule)。
如果您的方法是阻塞的,其中包括对其他正在阻塞的库的调用,则您不能假装它们是阻塞的@NonBlocking。如果删除注释@NonBlocking,方法调用将被卸载到线程池,并且事件循环保持空闲以处理其他请求。这有一些开销,而且线程池不是无限的,但我敢说它在绝大多数情况下都能正常工作。
| 归档时间: |
|
| 查看次数: |
922 次 |
| 最近记录: |