【发布时间】:2021-08-26 10:08:51
【问题描述】:
我已将 Micronaut 应用程序从 2.5.XX 更新到 3.0.0。根据 Micronaut 文档,项目 reactor 是推荐用于响应式编程的响应式库。
@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 结束点 curl -X 'GET' 'http://localhost:8081/product/search/ffff' -H 'accept: application/json' 时,它会进入无限。
由于我在系统上有错误,所以 return 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)
【问题讨论】:
标签: java project-reactor micronaut reactor micronaut-rest