solicitud HTTP de interrupción después de un número determinado de segundos

Marca :

Im usando Java 1.8, dropwizard 1.3.5 y 1.0.13 contoneo de inflexión para mi API.

Tengo un método que toma una petición HTTP, retrasa 20 segundos, a continuación, devuelve una respuesta de código de estado 200:

public ResponseContext delayBy20Seconds(RequestContext context) {
    ResponseContext response = new ResponseContext().contentType(MediaType.APPLICATION_JSON_TYPE);

    Thread.sleep(20000);

    response.status(Response.Status.OK);
    return response;
}

Digamos que quiero devolver un código de estado 400 si la operación (que en este caso toma 20 segundos), tarda más de 15 segundos. ¿Cómo voy a lograr esto?

coladict:

Una forma de hacerlo sin bibliotecas adicionales es usando el java.util.concurrentpaquete. La manera más segura para cancelar una tarea de larga duración de este tipo es mediante la ejecución de un hilo separado.

import java.util.concurrent.*;

...

private ExecutorService exec = Executors.newSingleThreadExecutor();
public ResponseContext delayBy20Seconds(RequestContext context) {
    Callable<ResponseContext> task = new Callable<ResponseContext>() {
        @Override
        public ResponseContext call() throws Exception {
            Thread.sleep(20000);
            return new ResponseContext().contentType(MediaType.APPLICATION_JSON_TYPE);
        }
    };
    List<Callable<ResponseContext>> tasks = new ArrayList<>();
    tasks.add(task);
    List<Future<ResponseContext>> done = exec.invokeAll(tasks, 15, TimeUnit.SECONDS);
    Future<ResponseContext> task1 = done.get(0);
    if (task1.isCancelled()) {
        return some Error Response;
    }
    return task1.get();
}

Su ExecutorServiceno debe ser estático, porque no desea compartirlo entre hilos para este uso en particular.

La Callable<ResponseContext>aplicación es donde se realiza el trabajo para la tarea de larga duración. Y como debe ser evidente en la exec.invokeAllllamada que decimos que la cantidad que estamos dispuestos a esperar. La lista de Futuros devuelta contendrá siempre tantos elementos como la lista de tareas, así que no hay necesidad de comprobar el vacío. Sólo tenemos que comprobar si la tarea se ha completado o no.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=185000&siteId=1
Recomendado
Clasificación