当前位置: 首页 > 知识库问答 >
问题:

在运行时使用Jersey决定同步或异步响应

暴奕
2023-03-14
@Path("resource")
public class Resource {
    @GET
    @Produces({MediaType.TEXT_PLAIN})
    public Response get() {
        return Response.ok("Hello there!").build();
    }
}
@Path("resource")
public class Resource {
    @GET
    @Produces({MediaType.TEXT_PLAIN})
    public void get(@Suspended final AsyncResponse r) {
        r.resume(Response.ok("Hello there!").build()); // usually called somewhere from another thread
    }
}

根据某些参数,我希望在运行时决定GET请求应该同步还是异步处理。在这两种情况下,资源endpoint的URL(http://server/resource)必须相同。这可能吗?

当然,正如您在上面的示例中所看到的,可以通过调用AsyncResponse.Resume(...)以异步方式伪造同步版本。但是,我会避免创建异步响应的开销。

共有1个答案

时修贤
2023-03-14

JAX-RS异步服务器API是关于容器如何管理请求的。但它仍然会保留请求,不会影响客户体验。

引用关于异步服务器API的Jersey文档:

注意,使用服务器端异步处理模型不会改善客户端感知的请求处理时间。然而,当请求仍在队列中等待处理或处理仍在另一个专用线程上运行时,它将释放初始请求处理线程到I/O容器,从而增加服务器的吞吐量。释放的I/O容器线程可用于接受和处理新传入的请求连接。

@Provider
@PreMatching
public class PreMatchingFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {

        if (requestContext.getHeaders().get("X-Use-Async") != null) {
            requestContext.setRequestUri(yourNewURI);
        }
    }
}

我还没有测试下面的解决方案,但它应该可以工作。您可以为同步和异步方法保留相同的URL,只是为每个方法接受不同的内容类型。

例如:

  • 同步方法:@consumes(“application/vnd.example.sync+text”)
  • 异步方法:@consumes(“application/vnd.example.async+text”)
if (useSync) {
    requestContext.getHeaders().putSingle(
        HttpHeaders.CONTENT_TYPE, "application/vnd.example.sync+text");
} else {
    requestContext.getHeaders().putSingle(
        HttpHeaders.CONTENT_TYPE, "application/vnd.example.async+text");
}
 类似资料:
  • 我意识到这是一个基本问题,但我没能在别处找到答案。 是

  • 是否可以调用一个异步方法,以便它从一个同步的方法异步运行?我不关心它挂起同步调用程序直到它返回,而是希望该方法被异步调用。

  • 问题内容: 我已经开始学习Java的并发和线程。我知道同步的基础知识(即它的作用)。从概念上讲,我知道它提供了对Java中具有多个线程的共享资源的互斥访问。但是,当面对下面的示例时,让我感到困惑的是同步它是否是一个好主意。我知道代码的关键部分应该同步,并且不应过度使用此关键字,否则会影响性能。 问题答案: 假设每个线程通过 不同的数组, 则不需要同步,因为其余变量是局部的。 相反,如果您触发所有调

  • 问题内容: 我该如何做这项工作 我试图从异步之一获取同步功能,我需要它来使用FreeTds异步查询作为同步之一 问题答案: 使用deasync-用C ++编写的模块,它将Node.js事件循环暴露给JavaScript。该模块还公开了一个函数,该函数阻止后续代码,但不阻止整个线程,也不引起繁忙的等待。您可以将函数放入循环中:

  • 我正在为一家德国公司评估Dart,将各种Java程序移植到Dart,并对结果进行比较和分析。在浏览器中,飞镖轻松获胜。对于服务器来说,软件性能似乎是一个严重的问题(请看我的这个问题),但这基本上得到了缓解。 现在我正在移植一些“简单”的命令行工具,我没想到会有任何严重的问题,但至少有一个问题。一些工具确实会发出HTTP请求来收集一些数据,独立的Dart虚拟机只以异步方式支持它们。纵观所有我能找到的

  • 问题内容: 假设我要实现一个非常简单的类,并且要注意并发和多线程问题, 即使是以下方法,还是要这样做吗? 另一方面,如果我们将所有方法都同步了,就不会再使用了,对吗? 问题答案: 将您的金额声明为不会阻止线程在方法执行过程中被抢占(如果未同步)。因此,举例来说,如果您的方法没有以任何方式同步,即使您的方法数量达到 这些问题称为比赛条件。一个可能的示例是,当两个线程尝试从同一帐户转移资金时。当一个线