2017-10-11 85 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'的意思是刪除過濾器的需要,恕我直言,從來沒有打算處理這種情況下:) –