update, move deferredresult controller (#4164)
This commit is contained in:
parent
e166f5d9c9
commit
4a08fd1352
|
@ -1,71 +0,0 @@
|
||||||
package com.baeldung.servlets;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.ui.Model;
|
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
import org.springframework.web.context.request.async.DeferredResult;
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
public class DeferredResultController {
|
|
||||||
|
|
||||||
private final static Logger LOG = LoggerFactory.getLogger(DeferredResultController.class);
|
|
||||||
|
|
||||||
@GetMapping("/async-deferredresult")
|
|
||||||
public DeferredResult<ResponseEntity<?>> handleReqDefResult(Model model) {
|
|
||||||
LOG.info("Received async-deferredresult request");
|
|
||||||
DeferredResult<ResponseEntity<?>> output = new DeferredResult<>();
|
|
||||||
new Thread(() -> {
|
|
||||||
LOG.info("Processing in separate thread");
|
|
||||||
output.setResult(ResponseEntity.ok("ok"));
|
|
||||||
}).start();
|
|
||||||
LOG.info("servlet thread freed");
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DeferredResult<ResponseEntity<?>> handleReqWithTimeouts(Model model) {
|
|
||||||
LOG.info("Received async request with a configured timeout");
|
|
||||||
DeferredResult<ResponseEntity<?>> deferredResult = new DeferredResult<>(500l);
|
|
||||||
deferredResult.onTimeout(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
deferredResult.setErrorResult(
|
|
||||||
ResponseEntity.status(HttpStatus.REQUEST_TIMEOUT).body("Request timeout occurred."));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
new Thread(() -> {
|
|
||||||
LOG.info("Processing in separate thread");
|
|
||||||
try {
|
|
||||||
Thread.sleep(600l);
|
|
||||||
deferredResult.setResult(ResponseEntity.ok("ok"));
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
LOG.info("Request processing interrupted");
|
|
||||||
deferredResult.setErrorResult(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
|
||||||
.body("INTERNAL_SERVER_ERROR occurred."));
|
|
||||||
}
|
|
||||||
|
|
||||||
}).start();
|
|
||||||
LOG.info("servlet thread freed");
|
|
||||||
return deferredResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DeferredResult<ResponseEntity<?>> handleAsyncFailedRequest(Model model) {
|
|
||||||
DeferredResult<ResponseEntity<?>> deferredResult = new DeferredResult<>();
|
|
||||||
new Thread(() -> {
|
|
||||||
try {
|
|
||||||
// Exception occurred in processing
|
|
||||||
throw new Exception();
|
|
||||||
} catch (Exception e) {
|
|
||||||
LOG.info("Request processing failed");
|
|
||||||
deferredResult.setErrorResult(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
|
||||||
.body("INTERNAL_SERVER_ERROR occurred."));
|
|
||||||
}
|
|
||||||
}).start();
|
|
||||||
return deferredResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
package org.baeldung.web.controller;
|
||||||
|
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
import org.springframework.web.context.request.async.DeferredResult;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
public class DeferredResultController {
|
||||||
|
|
||||||
|
private final static Logger LOG = LoggerFactory.getLogger(DeferredResultController.class);
|
||||||
|
|
||||||
|
@GetMapping("/async-deferredresult")
|
||||||
|
public DeferredResult<ResponseEntity<?>> handleReqDefResult(Model model) {
|
||||||
|
LOG.info("Received request");
|
||||||
|
DeferredResult<ResponseEntity<?>> deferredResult = new DeferredResult<>();
|
||||||
|
|
||||||
|
deferredResult.onCompletion(() -> LOG.info("Processing complete"));
|
||||||
|
|
||||||
|
CompletableFuture.supplyAsync(() -> {
|
||||||
|
LOG.info("Processing in separate thread");
|
||||||
|
try {
|
||||||
|
Thread.sleep(6000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "OK";
|
||||||
|
})
|
||||||
|
.whenCompleteAsync((result, exc) -> deferredResult.setResult(ResponseEntity.ok(result)));
|
||||||
|
|
||||||
|
LOG.info("Servlet thread freed");
|
||||||
|
return deferredResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/process-blocking")
|
||||||
|
public ResponseEntity<?> handleReqSync(Model model) {
|
||||||
|
// ...
|
||||||
|
return ResponseEntity.ok("ok");
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/async-deferredresult-timeout")
|
||||||
|
public DeferredResult<ResponseEntity<?>> handleReqWithTimeouts(Model model) {
|
||||||
|
LOG.info("Received async request with a configured timeout");
|
||||||
|
DeferredResult<ResponseEntity<?>> deferredResult = new DeferredResult<>(500l);
|
||||||
|
deferredResult.onTimeout(() -> deferredResult.setErrorResult(ResponseEntity.status(HttpStatus.REQUEST_TIMEOUT)
|
||||||
|
.body("Request timeout occurred.")));
|
||||||
|
|
||||||
|
CompletableFuture.supplyAsync(() -> {
|
||||||
|
LOG.info("Processing in separate thread");
|
||||||
|
try {
|
||||||
|
Thread.sleep(6000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "error";
|
||||||
|
})
|
||||||
|
.whenCompleteAsync((result, exc) -> deferredResult.setResult(ResponseEntity.ok(result)));
|
||||||
|
LOG.info("servlet thread freed");
|
||||||
|
return deferredResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/async-deferredresult-error")
|
||||||
|
public DeferredResult<ResponseEntity<?>> handleAsyncFailedRequest(Model model) {
|
||||||
|
LOG.info("Received async request with a configured error handler");
|
||||||
|
DeferredResult<ResponseEntity<?>> deferredResult = new DeferredResult<>();
|
||||||
|
deferredResult.onError(new Consumer<Throwable>() {
|
||||||
|
@Override
|
||||||
|
public void accept(Throwable t) {
|
||||||
|
deferredResult.setErrorResult(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||||
|
.body("An error occurred."));
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
LOG.info("servlet thread freed");
|
||||||
|
return deferredResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue