反应器通量返回误差无穷大



我已经从2.5更新了Micronaut应用程序。XX到3.0.0。根据Micronaut文档,项目反应器是用于响应式编程的推荐响应式库。

@Controller("/product")
public class ProductController implements IProductOperation {
@Override
public Flux<List> freeTextSearch(String text) {
return iProductManager.findFreeText(text).onErrorResume(throwable -> {
return Flux.error(new GlobalException(throwable));
});
}
}
public interface IProductOperation {
@Get(value = "/search/{text}")
Flux<?> freeTextSearch(@NotBlank String text);
}

当我旋度端点curl -X 'GET' 'http://localhost:8081/product/search/ffff' -H 'accept: application/json'时,它趋向无穷大

因为我在系统上有一个错误所以返回Flux.error(new GlobalException(throwable));应该返回500内部系统错误,然而,它会到无穷大

我已经集成了rabbitMQ,并且rabbitMQ的生产端已经关闭。iProductManager.findFreeText(text)抛出异常,因为rabbitMQ生产者没有运行。而不是无限的,它应该抛出一个异常,并且应该调用全局错误处理。但它没有像预期的那样工作

public class GlobalException extends RuntimeException{
public GlobalException(Throwable throwable){super(throwable);}
}

这个方法永远不会在错误时被调用。

@Produces
@Singleton
@Requires(classes = {GlobalException.class, ExceptionHandler.class})
public class GlobalExceptionHandler implements ExceptionHandler<GlobalException, HttpResponse> {
private static final Logger LOG = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@Override
public HttpResponse handle(HttpRequest request, GlobalException exception) {
LOG.error(exception.getLocalizedMessage());
LOG.error(exception.getCause().getMessage());
Arrays.stream(exception.getStackTrace()).forEach(item -> LOG.error(item.toString()));
return HttpResponse.serverError(exception.getLocalizedMessage());
}
}

22:40:02.151 [default-nioEventLoopGroup-1-3] INFO  reactor.Flux.OnErrorResume.1 - onSubscribe(FluxOnErrorResume.ResumeSubscriber)
22:40:02.176 [default-nioEventLoopGroup-1-3] INFO  reactor.Flux.OnErrorResume.1 - request(1)

我想你用错了反应器Flux操作员:

  • onErrorResume在错误情况下切换到不同的Flux;您可以将其视为"回退通量"。在你的例子中,回退抛出了一个错误——这可以解释无限循环。
  • onErrorMap应该做你正在寻找的:映射一个异常到另一个可以用于HTTP响应

如果你想包装所有异常从Flux中,你可以这样做:

return iProductManager.findFreeText(text)
.onErrorMap(throwable -> new GlobalException(throwable));

请注意,其他onErrorMap方法允许您拥有更细粒度的行为。

最新更新