Java 使用JAX-RS处理异步http请求?

Java 使用JAX-RS处理异步http请求?,java,multithreading,http,asynchronous,jax-rs,Java,Multithreading,Http,Asynchronous,Jax Rs,我正在使用JAX-RS为一个资源实现CRUD操作。在我的第一个用例中,它是一个阻塞(同步)请求,即在单线程执行中,客户机返回响应 用例1: @Path("/resourceService") public class CRUDService { @GET @Path("/{param}") public Response getResource(@PathParam("param") String id) { Resource res = SomeBe

我正在使用JAX-RS为一个资源实现CRUD操作。在我的第一个用例中,它是一个阻塞(同步)请求,即在单线程执行中,客户机返回响应

用例1:

@Path("/resourceService")
public class CRUDService {

    @GET
    @Path("/{param}")
    public Response getResource(@PathParam("param") String id) {

        Resource res = SomeBean().getResource(id);
        return Response.status(200).entity(res).build();

    }

}
用例2:

@Path("/resourceService")
public class CRUDService {

    @GET
    @Path("/{param}")
    public Response getResource(@PathParam("param") String id) {

        Resource res = SomeBean().getResource(id);
        return Response.status(200).entity(res).build();

    }

}
现在,我必须实现相同的请求,但它是一个非阻塞(异步)请求,因此,一旦请求到达服务器,我就必须向服务器返回一个响应,作为确认,即
响应
对象,并接受
(202)
状态代码,然后恢复初始请求处理(在本例中,通过id获取资源)

通过发送一个新的
POST
请求(其内容是检索到的资源),将此请求(检索到的资源)的响应发送给客户端,然后客户端将返回此
POST
请求的响应,并返回成功状态码。 (注意:这里的客户机不是bean浏览器,客户机和服务器都是被调用的RESTAPI中的机器)

我阅读了关于
异步JAX-RS
java.util.concurrent
包的内容

如果我像启动一个新线程那样异步执行请求处理,那么如何将ACK的第一次响应发送回。例:

@POST
   @Consumes("application/json")
   @Produces("application/json")
   public void getResource(@PathParam("param") String id,
                      final @Suspended AsyncResponse response) {
      new Thread() {
         public void run() {
            Resource res = SomeBean().getResource(id);
            response.resume(resource);
         }
      }.start();
   }
}
如何使用JAX-RS实现此调用流

编辑: 我尝试了你的回答中提到的方法,但是我得到了一个例外:

服务器日志:

2016 - 07 - 25 12: 22: 01, 521 ERROR[io.undertow.request](
 default task - 1) UT005023: Exception handling request to / resourceService: org.jboss.resteasy.spi.UnhandledException: java.lang.NoSuchMethodError: my.ow.dummy.package.CRUDService$1. < init > (Lmy / own / dummy / package / CRUDService;) V
at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java: 76)[resteasy - jaxrs - 3.0 .6.Final.jar: ]
at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java: 212)[resteasy - jaxrs - 3.0 .6.Final.jar: ]
at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java: 149)[resteasy - jaxrs - 3.0 .6.Final.jar: ]
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java: 372)[resteasy - jaxrs - 3.0 .6.Final.jar: ]
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java: 179)[resteasy - jaxrs - 3.0 .6.Final.jar: ]
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java: 220)[resteasy - jaxrs - 3.0 .6.Final.jar: ]
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java: 56)[resteasy - jaxrs - 3.0 .6.Final.jar: ]
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java: 51)[resteasy - jaxrs - 3.0 .6.Final.jar: ]
at javax.servlet.http.HttpServlet.service(HttpServlet.java: 790)[jboss - servlet - api_3 .1 _spec - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java: 85)[undertow - servlet - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java: 61)[undertow - servlet - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java: 36)[undertow - servlet - 1.0 .0.Final.jar: 1.0 .0.Final]
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java: 78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java: 25)[undertow - core - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java: 113)[undertow - servlet - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.security.handlers.AuthenticationCallHandler.handleRequest(AuthenticationCallHandler.java: 52)[undertow - core - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java: 45)[undertow - core - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java: 61)[undertow - servlet - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java: 70)[undertow - servlet - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java: 76)[undertow - core - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java: 25)[undertow - core - 1.0 .0.Final.jar: 1.0 .0.Final]
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java: 61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java: 25)[undertow - core - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java: 25)[undertow - core - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java: 240)[undertow - servlet - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java: 227)[undertow - servlet - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java: 73)[undertow - servlet - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java: 146)[undertow - servlet - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.server.Connectors.executeRootHandler(Connectors.java: 168)[undertow - core - 1.0 .0.Final.jar: 1.0 .0.Final]
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java: 687)[undertow - core - 1.0 .0.Final.jar: 1.0 .0.Final]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: 1145)[rt.jar: 1.7 .0 _40]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: 615)[rt.jar: 1.7 .0 _40]
at java.lang.Thread.run(Thread.java: 724)[rt.jar: 1.7 .0 _40]
Caused by: java.lang.NoSuchMethodError: my.ow.dummy.package.CRUDService$1. < init > (Lmy / own / dummy / package / CRUDService;) V at my.ow.dummy.package.CRUDService.handlePutRequest(CRUDService.java: 78)[classes: ]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[rt.jar: 1.7 .0 _40]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 57)[rt.jar: 1.7 .0 _40]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43)[rt.jar: 1.7 .0 _40]
at java.lang.reflect.Method.invoke(Method.java: 606)[rt.jar: 1.7 .0 _40]
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java: 137)[resteasy - jaxrs - 3.0 .6.Final.jar: ]
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java: 280)[resteasy - jaxrs - 3.0 .6.Final.jar: ]
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java: 234)[resteasy - jaxrs - 3.0 .6.Final.jar: ]
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java: 221)[resteasy - jaxrs - 3.0 .6.Final.jar: ]
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java: 356)[resteasy - jaxrs - 3.0 .6.Final.jar: ]
 ...29 more
2016-07-2512:22:01521错误[io.undertow.request](
默认任务-1)UT005023:org.jboss.resteasy.spi.UnhandledException:java.lang.NoSuchMethodError:my.ow.dummy.package.CRUDService$1的异常处理请求初始化>(Lmy/own/dummy/package/CRUDService;)V
位于org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:76)[resteasy-jaxrs-3.0.6.Final.jar:]
位于org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:212)[resteasy-jaxrs-3.0.6.Final.jar:]
位于org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:149)[resteasy-jaxrs-3.0.6.Final.jar:]
在org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:372)[resteasy-jaxrs-3.0.6.Final.jar:]
位于org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179)[resteasy-jaxrs-3.0.6.Final.jar:]
在org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220)[resteasy-jaxrs-3.0.6.Final.jar:]
位于org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)[resteasy-jaxrs-3.0.6.Final.jar:]
位于org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)[resteasy-jaxrs-3.0.6.Final.jar:]
在javax.servlet.http.HttpServlet.service(HttpServlet.java:790)[jboss-servlet-api_3.1\u spec-1.0.0.Final.jar:1.0.0.Final]
在io.undertow.servlet.handlers.ServletHandler.HandlerRequest(ServletHandler.java:85)[undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
位于io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.HandlerRequest(ServletSecurityRoleHandler.java:61)[undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
位于io.undertow.servlet.handlers.ServletDispatchingHandler.HandlerRequest(ServletDispatchingHandler.java:36)[undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
位于org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.HandlerRequest(SecurityContextAssociationHandler.java:78)
在io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)[undertow-core-1.0.0.Final.jar:1.0.0.Final]
位于io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113)[undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
在io.undertow.security.handlers.AuthenticationCallHandler.HandlerRequest(AuthenticationCallHandler.java:52)[undertow-core-1.0.0.Final.jar:1.0.0.Final]
位于io.undertow.security.handlers.AbstractSecretentityHandler.HandlerRequest(AbstractSecretentityHandler.java:45)[undertow-core-1.0.0.Final.jar:1.0.0.Final]
位于io.undertow.servlet.handlers.security.ServletSecretentityConstraintHandler.HandlerRequest(ServletSecretentityConstraintHandler.java:61)[undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
位于io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.HandlerRequest(CachedAuthenticatedSessionHandler.java:70)[undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
在io.undertow.security.handlers.SecurityInitialHandler.HandlerRequest(SecurityInitialHandler.java:76)[undertow-core-1.0.0.Final.jar:1.0.0.Final]
在io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)[undertow-core-1.0.0.Final.jar:1.0.0.Final]
位于org.wildfly.extension.undertow.security.jacc.jaccontextidhandler.handleRequest(jaccontextidhandler.java:61)
在io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)[undertow-core-1.0.0.Final.jar:1.0.0.Final]
在io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)[undertow-core-1.0.0.Final.jar:1.0.0.Final]
位于io.undertow.servlet.handlers.ServletiInitialHandler.handleFirstRequest(ServletialHandler.java:240)[undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
在io.undertow.servlet.handlers.ServletiInitialHandler.dispatchRequest(ServletiInitialHandler.java:227)[undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
在io.undertow.servlet.handlers.ServletiInitialHandler.access$000(servletiInitialHandler.java:73)[undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
在io.undertow.servlet.handlers.ServletInitialHandler$1.HandlerRequest(ServletInitialHandler。
public static void main(String args[]) {
    Runnable thread = () -> {
        // you code goes here
        // which you want to execute in a new thread
    };
    // return response code / ACK
}
@GET
@Path("/{param}")
public Response getResource(@PathParam("param") String id, @HeaderParam(
"SendBackUri") String uri) {
    new Thread() {
       public void run() {
          Resource res = SomeBean().getResource(id);
          ClientBuilder.newClient().target(uri).request().buildPost(Entity.entity(res, MediaType.WILDCARD_TYPE)).invoke();
       }
    }.start();
    return Response.status(202).build();
}
@GET
@Path("/{param}")
public Response getResource(@PathParam("param") String id, @HeaderParam(
"SendBackUri") String uri) {
    executorService.execute(new Runnable() {
       public void run() {
          Resource res = SomeBean().getResource(id);
          Response response = ClientBuilder.newClient().target(uri).request().buildPost(Entity.entity(res, MediaType.WILDCARD_TYPE)).invoke();
          //deal with response
       }
    });
    return Response.status(202).build();
}
Future<Response> f = ClientBuilder.newClient().target(uri).request().async().get();
//do some client specific stuff which you probably do when receive 202;
Response r = f.get(); //wait for response
//do whatever you would do with the resource
public void getResource(@PathParam("param") String id,
                  final @Suspended AsyncResponse response)