Parameters of type CommandCallback will have their onResult(CommandMessage<? extends C>, CommandResultMessage<? extends R>) invoked after the command has been handled. Although the CommandCallback provides a means to deal with the result of command handling, this is no impact on whether you can define a return type on the custom command gateway. In case both a callback and return type are defined, the invocations of the callback will always match with the return value (or exception). Lastly, know that you may pass in several CommandCallback instances, which all will be invoked in order.