Interface CommandBus
-
- All Known Implementing Classes:
AbstractCommandBus,LocalCommandBus
public interface CommandBusTheCommandBusprovides an indirection between a command and theCommandHandlerthat's capable of handling the command.
Commands can be sent synchronously usingsend(Object)or asynchronously usingsendAsync(Object)that returns aMono.
The handling of a command usually doesn't return any value (according to the principles of CQRS), however theLocalCommandBusAPI allows aCommandHandlerto return a value if needed (e.g. such as a server generated id)
One important rule is that there can only be oneCommandHandlerinstance that can handle any given command type.
If multipleCommandHandlerclaim that they all can handle a given command type thensend(Object)/sendAsync(Object)will throwMultipleCommandHandlersFoundException
If noCommandHandler's can handle the given command type thensend(Object)/sendAsync(Object)will throwNoCommandHandlerFoundException
Example:
In case you need to colocate multiple related command handling methods inside a single class then you should have your command handling class extendvar commandBus = new LocalCommandBus(); commandBus.addCommandHandler(new CreateOrderCommandHandler(...)); commandBus.addCommandHandler(new ImburseOrderCommandHandler(...)); var optionalResult = commandBus.send(new CreateOrder(...)); // or var monoWithOptionalResult = commandBus.sendAsync(new ImbuseOrder(...)) .block(Duration.ofMillis(1000));AnnotatedCommandHandler.
Example:{@code public class OrdersCommandHandler extends AnnotatedCommandHandler {- See Also:
AnnotatedCommandHandler
-
-
Method Summary
All Methods Instance Methods Abstract Methods Default Methods Modifier and Type Method Description CommandBusaddCommandHandler(CommandHandler commandHandler)Add a new command handler.CommandBusaddInterceptor(CommandBusInterceptor interceptor)Add a new interceptordefault CommandBusaddInterceptors(List<CommandBusInterceptor> interceptors)Add new interceptorsCommandHandlerfindCommandHandlerCapableOfHandling(Object command)Find aCommandHandlercapable of handling the given commandList<CommandBusInterceptor>getInterceptors()Returns an immutable list of interceptorsbooleanhasCommandHandler(CommandHandler commandHandler)Guard method to test if theCommandBusalready contains the commandHandlerbooleanhasInterceptor(CommandBusInterceptor interceptor)Guard method to test if theCommandBusalready contains the interceptorCommandBusremoveCommandHandler(CommandHandler commandHandler)Remove a command handler.CommandBusremoveInterceptor(CommandBusInterceptor interceptor)Remove an interceptor<R,C>
Rsend(C command)The send command synchronously and process the command on the sending thread<C> voidsendAndDontWait(C command)The send command asynchronously without waiting for the result of processing the Command.
The command handler cannot return any value when invoked using this method.<C> voidsendAndDontWait(C command, Duration delayMessageDelivery)The send command asynchronously without waiting for the result of processing the Command.
The command handler cannot return any value when invoked using this method.<R,C>
reactor.core.publisher.Mono<R>sendAsync(C command)The send command asynchronously and process the command on aSchedulers.boundedElastic()thread
-
-
-
Method Detail
-
getInterceptors
List<CommandBusInterceptor> getInterceptors()
Returns an immutable list of interceptors- Returns:
- Returns an immutable list of interceptors
-
addInterceptor
CommandBus addInterceptor(CommandBusInterceptor interceptor)
Add a new interceptor- Parameters:
interceptor- the interceptor to add- Returns:
- this bus instance
-
addInterceptors
default CommandBus addInterceptors(List<CommandBusInterceptor> interceptors)
Add new interceptors- Parameters:
interceptors- the interceptors to add- Returns:
- this bus instance
-
hasInterceptor
boolean hasInterceptor(CommandBusInterceptor interceptor)
Guard method to test if theCommandBusalready contains the interceptor- Parameters:
interceptor- the interceptor to check- Returns:
- true if the
CommandBusalready contains the interceptor, otherwise false
-
removeInterceptor
CommandBus removeInterceptor(CommandBusInterceptor interceptor)
Remove an interceptor- Parameters:
interceptor- the interceptor to remove- Returns:
- this bus instance
-
addCommandHandler
CommandBus addCommandHandler(CommandHandler commandHandler)
Add a new command handler.- Parameters:
commandHandler- the command handler to add- Returns:
- this bus instance
-
removeCommandHandler
CommandBus removeCommandHandler(CommandHandler commandHandler)
Remove a command handler.- Parameters:
commandHandler- the command handler to remove- Returns:
- this bus instance
-
send
<R,C> R send(C command)
The send command synchronously and process the command on the sending thread- Type Parameters:
R- the return typeC- the command type- Parameters:
command- the command to send- Returns:
- the result of the command processing (if any)
- Throws:
MultipleCommandHandlersFoundException- If multipleCommandHandlerclaim that they can handle a given commandNoCommandHandlerFoundException- If noCommandHandler's can handle the given command
-
sendAsync
<R,C> reactor.core.publisher.Mono<R> sendAsync(C command)
The send command asynchronously and process the command on aSchedulers.boundedElastic()thread- Type Parameters:
R- the return typeC- the command type- Parameters:
command- the command to send- Returns:
- a
Monothat will contain the result of the command processing (if any) - Throws:
MultipleCommandHandlersFoundException- If multipleCommandHandlerclaim that they can handle a given commandNoCommandHandlerFoundException- If noCommandHandler's can handle the given command
-
sendAndDontWait
<C> void sendAndDontWait(C command)
The send command asynchronously without waiting for the result of processing the Command.
The command handler cannot return any value when invoked using this method.- Type Parameters:
C- the command type- Parameters:
command- the command to send- Throws:
MultipleCommandHandlersFoundException- If multipleCommandHandlerclaim that they can handle a given commandNoCommandHandlerFoundException- If noCommandHandler's can handle the given command
-
sendAndDontWait
<C> void sendAndDontWait(C command, Duration delayMessageDelivery)The send command asynchronously without waiting for the result of processing the Command.
The command handler cannot return any value when invoked using this method.- Type Parameters:
C- the command type- Parameters:
command- the command to senddelayMessageDelivery- how long should we delay the command message sending- Throws:
MultipleCommandHandlersFoundException- If multipleCommandHandlerclaim that they can handle a given commandNoCommandHandlerFoundException- If noCommandHandler's can handle the given command
-
findCommandHandlerCapableOfHandling
CommandHandler findCommandHandlerCapableOfHandling(Object command)
Find aCommandHandlercapable of handling the given command- Parameters:
command- the command to handle- Returns:
- the single
CommandHandlerthat's capable of handling the given command - Throws:
MultipleCommandHandlersFoundException- If multipleCommandHandlerclaim that they can handle a given commandNoCommandHandlerFoundException- If noCommandHandler's can handle the given command
-
hasCommandHandler
boolean hasCommandHandler(CommandHandler commandHandler)
Guard method to test if theCommandBusalready contains the commandHandler- Parameters:
commandHandler- the commandHandler to check- Returns:
- true if the
CommandBusalready contains the commandHandler, otherwise false
-
-