我正在使用 Netflix 的 Hystrix 库来构建一个 REST 客户端并进行断路器设置以连接远程服务。我想通过他们提供的库来设置事件流和仪表盘监控。查看他们的示例应用程序here,似乎需要将他们的 Servlet 过滤器和 Servlet 类应用到我的 Web 应用程序中。
我使用 Spring Boot 和 Jersey 2,在 JerseyConfig.java 中连接我的资源和过滤器(没有 web.xml)。我知道 Jersey 过滤器与 Servlet 过滤器不同,并且很难将两者整合在一起。
那么,如何将 Java Servlet 过滤器转换为 Jersey 过滤器,并将 Java Servlet 转换为 Jersey 资源?
对于 Servlet,我当前的策略是将其封装如下,每个一个。
@Path("/hystrix.stream")
public class HystrixResource extends HystrixUtilizationSseServlet {
@Context
HttpServletRequest httpRequest;
@Context
HttpServletResponse httpResponse;
//This returns void because it is a text/stream output that must remain open,
//so the httpResponse is continually written to until the conenction is closed
@GET
public void doGet() throws ServletException, IOException {
doGet(httpRequest, httpResponse);
}
}
这可能有效,但由于某些原因数据基本上为空。我猜测原因是因为过滤器没有起作用。
data: {"type":"HystrixUtilization","commands":{},"threadpools":{}}
我不太清楚如何包装Servlet Filters,因为它们期望的输入和输出与Jersey ContainerRequestFilter不同。在我的JerseyConfig中实现以下内容似乎没有任何作用,因为日志没有表明过滤器已被注册,并且我无法在调试模式下断点这些文件中的行。
@Component
@ApplicationPath("/")
public class JerseyConfig extends ResourceConfig {
private static final Logger LOGGER = Logger.getLogger("JerseyConfig");
public JerseyConfig(){
//filter to provide a bridge between JAX-RS and Spring request attributes
register(RequestContextFilter.class);
register(SpringComponentProvider.class);
//handles custom serialization
register(new ObjectMapperContextResolver());
//try to register the filters - which doesn't work because these aren't Jersey Filters
register(HystrixRequestContextServletFilter.class);
register(HystrixRequestLogViaResponseHeaderServletFilter.class);
registerResources();
/*
* Enable the logging filter to see the HTTP response for each request.
*/
register(new LoggingFilter(LOGGER, true));
}
}