2017-10-11 83 views
0

我有一种情况,我需要为接收到的每个请求返回“接受”响应,并稍后将实际响应发布到服务之外的单独端点。如何在泽西岛的过滤器发送响应后继续进行请求处理?

为了实现“接受”的响应,我实现了一个过滤器。

public class AcknowledgementFilter implements ContainerRequestFilter{ 

@Override 
public void filter(ContainerRequestContext containerRequestContext) throws IOException { 
    containerRequestContext.abortWith(Response.accepted().build()); 
    // call Resource method in new Thread() . <------ ? 
} 

} 

服务端点的执行情况:

@Path("/vendor") 
public class VendorHandler { 

@POST 
public void addVendor(VendorRequest addVendorRequest)){ 
    vendor = new Vendor(); 
    Client.publish(vendor); // publish request to an endpoint 
    return null; 
} 

如何调用VendorHandler的addVendor(或任何方法取决于请求)从确认过滤器?

是否有任何其他方式来为每个请求实现接受的响应,然后分别处理请求?

回答

0

您可以使用AsyncResponse,

@GET 
@ManagedAsync 
@Produces(MediaType.APPLICATION_JSON) 
public void getLives(@Suspended final AsyncResponse asyncResponse, 
        @DefaultValue("0") @QueryParam("newestid") final int newestId, 
        @QueryParam("oldestid") final Integer oldestId) { 

    asyncResponse.setTimeoutHandler(asyncResponse1 -> { 
     logger.info("reached timeout"); 
     asyncResponse1.resume(Response.ok().build()); 
    }); 

    asyncResponse.setTimeout(5, TimeUnit.MINUTES); 

    try { 
     List<Life> lives = oldestId == null ? 
       Lifes.getLastLives(newestId) : Lifes.getOlderLives(oldestId); 

     if (lives.size() > 0) { 
      final GenericEntity<List<Life>> entity = new GenericEntity<List<Life>>(lives) { 
      }; 
      asyncResponse.resume(entity); 
     } else LifeProvider.suspend(asyncResponse); 

    } catch (SQLException e) { 
     logger.error(e, e); 
     asyncResponse.resume(new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR)); 
    } 

} 

检查这个Link了解更多详情。

+0

我不认为资源方法会被调用,因为响应已经发送到过滤器中的客户端。 –

+0

我认为'AsyncResponse'的意思是删除过滤器的需要,恕我直言,从来没有打算处理这种情况下:) –