Quarkus反应式上下文下ServerRequestFilter中使用Keycloak客户端触发BlockingNotAllowedException问题求助
Quarkus反应式上下文下ServerRequestFilter中使用Keycloak客户端触发BlockingNotAllowedException问题求助
各位大佬好,我最近在基于Quarkus做反应式开发时遇到了一个棘手的问题,想请教下大家的解决方案!
我当前使用的技术栈是Quarkus,搭配了quarkus-resteasy-reactive和quarkus-keycloak-admin-client-reactive扩展。我需要实现一个ServerRequestFilter,在请求过滤阶段调用Keycloak管理客户端查询用户的某个属性,但奇怪的是,明明用的是反应式版本的客户端,调用它的方法时却不断抛出BlockingNotAllowedException。
以下是我写的过滤器代码:
public class Filters { @Inject Keycloak keycloak; @ServerRequestFilter public Uni<Response> filter(ContainerRequestContext requestContext) { return Uni.createFrom().item(() -> keycloak.realm("my-realm") .users() .search("user-that-i-get-from-context") .stream() .findFirst() .orElseThrow() .firstAttribute("the-attribute")) .map(attr -> { if (attr.equals("some-value")){ return null; } return Response.status(403).build(); }); } }
我尝试过给Uni添加runSubscriptionOn(Infrastructure.getDefaultWorkerPool())来切换线程池,但报错依然存在。另外需要说明的是,我不能将请求改成阻塞式的,因为我希望所有端点都保持反应式的特性,避免阻塞事件循环。
我自己猜测问题可能出在过滤器的上下文环境或者Keycloak客户端的注入环节,但反复排查也没找到确切的问题点,希望有经验的朋友能帮忙分析下原因,或者给出可行的解决思路!
备注:内容来源于stack exchange,提问作者Tiago Grosso
相关产品推荐
相关产品推荐

