public class Deferred extends Result
A Deferred result, useful for async request processing.
Application can produces a result from a different thread. Once result is ready, a call to resolve(Object)
is required. Please note, a call to reject(Throwable)
is required in case of errors.
{ get("/async", deferred(() -> { return "Success"; })); }From MVC route:
public class Controller {
@GET
@Path("/async")
public Deferred async() {
return Deferred.deferred(() -> "Success");
}
}
If you add the AsyncMapper
then your controller method can return a Callable
. Previous example runs in the default executor, which always run deferred results in the same/caller thread. To effectively run a deferred result in new/different thread you need to provide an Executor
:
{
executor(new ForkJoinPool());
}
This line override the default executor with a ForkJoinPool
. You can add two or more named executor:
{
executor(new ForkJoinPool());
executor("cached", Executors.newCachedExecutor());
get("/async", deferred("cached", () -> "Success"));
}
A Deferred
object works as a promise too, given you resolve(Object)
and reject(Throwable)
methods. Examples: As promise using the default executor (execute promise in same/caller thread):
{ get("/async", promise(deferred -> { try { deferred.resolve(...); // success value } catch (Throwable ex) { deferred.reject(ex); // error value } })); }As promise using a custom executor:
{ executor(new ForkJoinPool()); get("/async", promise(deferred -> { try { deferred.resolve(...); // success value } catch (Throwable ex) { deferred.reject(ex); // error value } })); }As promise using an alternative executor:
{ executor(new ForkJoinPool()); executor("cached", Executors.newCachedExecutor()); get("/async", promise("cached", deferred -> { try { deferred.resolve(...); // success value } catch (Throwable ex) { deferred.reject(ex); // error value } })); }
Modifier and Type | Class and Description |
---|---|
static interface |
Deferred.Handler
A deferred handler.
|
static interface |
Deferred.Initializer
Deferred initializer with Request access, useful to provide a more functional API.
|
static interface |
Deferred.Initializer0
Deferred initializer, useful to provide a more functional API.
|
Constructor and Description |
---|
Deferred()
Creates a new Deferred .
|
Deferred(Deferred.Initializer initializer)
Creates a new Deferred with an initializer.
|
Deferred(Deferred.Initializer0 initializer)
Creates a new Deferred with an initializer.
|
Deferred(String executor, Deferred.Initializer initializer)
Creates a new Deferred with an initializer.
|
Deferred(String executor, Deferred.Initializer0 initializer)
Creates a new Deferred with an initializer.
|
Modifier and Type | Method and Description |
---|---|
String |
callerThread()
Name of the caller thread (thread that creates this deferred object).
|
static Deferred |
deferred(Route.OneArgHandler handler)
Functional version of Deferred(Initializer) .
|
static Deferred |
deferred(Route.ZeroArgHandler handler)
Functional version of Deferred(Initializer) .
|
static Deferred |
deferred(String executor, Route.OneArgHandler handler)
Functional version of Deferred(Initializer) .
|
static Deferred |
deferred(String executor, Route.ZeroArgHandler handler)
Functional version of Deferred(Initializer) .
|
Optional<String> |
executor()
Get an executor to run this deferred result.
|
void |
handler(Request req, Deferred.Handler handler)
Setup a handler for this deferred.
|
void |
reject(Throwable cause)
Resolve the deferred with an error and handle it.
|
void |
resolve(Object value)
Resolve the deferred value and handle it.
|
Result |
set(Object value)
resolve(Object) or reject(Throwable) the given value.
|
public Deferred(String executor, Deferred.Initializer0 initializer)
Deferred
with an initializer.
executor
- Executor to use.
initializer
- An initializer.
public Deferred(Deferred.Initializer0 initializer)
Deferred
with an initializer.
initializer
- An initializer.
public Deferred(Deferred.Initializer initializer)
Deferred
with an initializer.
initializer
- An initializer.
public Deferred(@Nullable String executor, Deferred.Initializer initializer)
Deferred
with an initializer.
executor
- Executor to use.
initializer
- An initializer.
public Deferred()
Deferred
.
@Nonnull public Result set(Object value)
resolve(Object)
or reject(Throwable)
the given value.
@Nonnull public Optional<String> executor()
@Nonnull public String callerThread()
public void resolve(@Nullable Object value)
value
- A value for this deferred.
public void reject(Throwable cause)
cause
- A value for this deferred.
public void handler(Request req, Deferred.Handler handler) throws Exception
req
- Current request.
handler
- A response handler.
Exception
- If initializer fails to start.
@Nonnull public static Deferred deferred(Route.OneArgHandler handler)
Deferred(Initializer)
. Using the default executor (current thread):
{
get("/fork", deferred(req -> {
return req.param("value").value();
}));
}
Using a custom executor:
{
executor(new ForkJoinPool());
get("/fork", deferred(req -> {
return req.param("value").value();
}));
}
This handler automatically resolve(Object)
or reject(Throwable)
a route handler response.
handler
- Application block.
@Nonnull public static Deferred deferred(Route.ZeroArgHandler handler)
Deferred(Initializer)
. Using the default executor (current thread):
{
get("/fork", deferred(() -> {
return req.param("value").value();
}));
}
Using a custom executor:
{
executor(new ForkJoinPool());
get("/fork", deferred(() -> {
return req.param("value").value();
}));
}
This handler automatically resolve(Object)
or reject(Throwable)
a route handler response.
handler
- Application block.
@Nonnull public static Deferred deferred(String executor, Route.ZeroArgHandler handler)
Deferred(Initializer)
. To use ideally with one or more Executor
:
{
executor("cached", Executors.newCachedExecutor());
get("/fork", deferred("cached", () -> {
return "OK";
}));
}
This handler automatically resolve(Object)
or reject(Throwable)
a route handler response.
executor
- Executor to run the deferred.
handler
- Application block.
@Nonnull public static Deferred deferred(String executor, Route.OneArgHandler handler)
Deferred(Initializer)
. To use ideally with one or more Executor
:
{
executor("cached", Executors.newCachedExecutor());
get("/fork", deferred("cached", req -> {
return req.param("value").value();
}));
}
This handler automatically resolve(Object)
or reject(Throwable)
a route handler response.
executor
- Executor to run the deferred.
handler
- Application block.
Copyright © 2019. All rights reserved.