@OnSuccess
public void onSuccess(@Content String response, SourceCompletionCallback callback) {
asyncResponder.sendResponse(response, new ResponderCallback() {
void onSuccess() {
callback.success();
}
void onFailure(Throwable t) {
callback.error(t);
}
};)
}
Sending Asynchronous Responses from a Message Source
Sources can send responses in an asynchronous way. Some of the main uses cases for asynchronous sources are:
-
The response operation is non-blocking.
-
The response operation is blocking, but it is asynchronously executed in a thread other than the one that initiates it (most typically, the thread executing a method annotated with
OnSuccess
orOnError
). -
The source will perform asynchronous auditing for which it needs to consume a response stream in a separate thread.
In these cases:
-
The runtime needs to know that the response will be asynchronous. Otherwise, there will be a race condition between the thread emitting the response and the runtime that is trying to free up resources associated with the message that is getting a response.
-
Methods annotated with
OnSuccess
orOnError
must have an argument of typeSourceCompletionCallback
. That is enough to signal the runtime that the source is asynchronous.
The runtime will not finish the associated event until either the success()
or error(Throwable)
methods are invoked. Note that this is a very strong contract. A source that requests a SourceCompletionCallback
without properly notifying the runtime is one likely to freeze the entire runtime eventually.
Here is an example: