我有一个包含三个实现的jax-rs
API(让我们称之为mock
,legacy
和new
)。现在我想要的是创建某种代理功能,随后可以使用:
master
和slave
实现。master
实现的调用,该代理将异步调用slave
实现。slave
的结果如何,对原始调用的回复始终来自master
实施。slave
的结果永远不会延迟(或受影响)响应(因此是异步点)。我的想法是以某种方式劫持球衣的调度过程(理想情况下,Invocable对象和请求参数已经可用,然后使用jersey's extension Proxy client来调用另一个API。问题是我我不知道球衣的内部结构如此之好,所以我不知道如何创造这样的功能。但是,这仍然是可能的,例如球衣的ConfiguredValidator具有方法{{我需要的参数'。 1}}。
总结一些伪代码,该功能(作为某种类型的请求过滤器)可以做到这一点:
validateResourceAndInputParams
知道如何创建和注册此类功能吗?
答案 0 :(得分:2)
1)如果您正在寻找,则Jersey服务器为Filter
和Interceptor
提供支持。您可以将您的异步调用生成到slave来拦截请求,并像往常一样调用master流。这些过滤器可用于插入日志记录/自定义身份验证以及许多此类需求。
有ContainerResponseFilter
(例如,你需要这个来定制回复)和[ContainerRequestFilter][2]
调用不同网址的示例是
@Provider
@PreMatching
public class RedirectFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext reqContext) throws IOException {
// redirect conditionally
if (shouldRedirect(reqContext)) {
reqContext.setRequestUri(URI.create("/slave"));
}
}
private boolean shouldRedirect(ContainerRequestContext reqContext) {
//todo it should be conditional return
return true;
}
}
然后你的资源:
@Path("/")
public class MasterSlaveResource {
@GET
@Path("/master")
public String getResponse() {
return "master response";
}
@GET
@Path("/slave")
public String getTempResponse() {
return "slave response";
}
}
当然,这会向奴隶或主人发送请求,但我相信你可以调整它。
2)如果他们不满足您的要求,您可以访问资源中的HttpServletRequest
本身,并且可以发送/委派/发送它
@Context final HttpServletRequest request,