2017-10-11 3 views
0

私は受け取ったすべての要求に対して「受け入れられた」応答を返し、後で実際の応答をサービス外の別のエンドポイントに公開する必要がある状況があります。Jerseyのフィルタからの応答を送信した後で処理を続行するにはどうすればいいですか?

「受け入れられた」応答を実装するために、私はフィルタを実装しました。

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呼び出し(または任意のメソッドは、要求によって異なります)どうすればよいですか?

リクエストごとに受け入れられた応答を実装し、リクエストを別々に処理する他の方法はありますか?あなたはAsyncResponseを使用することができます

答えて

0

@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のポイントは、IMHOがそのようなケースを扱うことは決してなかったフィルタの必要性を取り除くことだと思います:) –

関連する問題