AXON framework synchronous response












0














I am new to AXON framework and are using it for our development. We have a requirement where command (command side) is created for the persisting data, for the same event is triggered which is consumed at query side. Now we need to have a response back to command side from query side which says if the record is persisted into database successfully (custom successful message) or if failed then the reason of the failure (custom exception message as response). Kindly help if there is any way to achieve such scenario.



Here command side and query side are 2 different micro-services and we are using Rabbit Mq for event driven technique.



Thanks in advance










share|improve this question



























    0














    I am new to AXON framework and are using it for our development. We have a requirement where command (command side) is created for the persisting data, for the same event is triggered which is consumed at query side. Now we need to have a response back to command side from query side which says if the record is persisted into database successfully (custom successful message) or if failed then the reason of the failure (custom exception message as response). Kindly help if there is any way to achieve such scenario.



    Here command side and query side are 2 different micro-services and we are using Rabbit Mq for event driven technique.



    Thanks in advance










    share|improve this question

























      0












      0








      0







      I am new to AXON framework and are using it for our development. We have a requirement where command (command side) is created for the persisting data, for the same event is triggered which is consumed at query side. Now we need to have a response back to command side from query side which says if the record is persisted into database successfully (custom successful message) or if failed then the reason of the failure (custom exception message as response). Kindly help if there is any way to achieve such scenario.



      Here command side and query side are 2 different micro-services and we are using Rabbit Mq for event driven technique.



      Thanks in advance










      share|improve this question













      I am new to AXON framework and are using it for our development. We have a requirement where command (command side) is created for the persisting data, for the same event is triggered which is consumed at query side. Now we need to have a response back to command side from query side which says if the record is persisted into database successfully (custom successful message) or if failed then the reason of the failure (custom exception message as response). Kindly help if there is any way to achieve such scenario.



      Here command side and query side are 2 different micro-services and we are using Rabbit Mq for event driven technique.



      Thanks in advance







      rabbitmq cqrs event-driven axon event-driven-design






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 21 '18 at 13:54









      Jaspal

      1




      1
























          4 Answers
          4






          active

          oldest

          votes


















          1














          I think that what you are asking is if there is a way for the command and event to be processed in a single transaction?



          If you use a subscribing event processor, running in the same JVM, the event is processed synchronously and the whole transaction is rolled back in case of an exception in an event handler. This is not the case here, because you have loosely coupled separate services, which is good.



          It's best practice for the aggregate with the command handler to have all the information available to decide whether or not the command can successfully be processed, and when an event is applied, this is a signal that it has happened, and the other services (the query side in this case) have to be informed. It's not good practice for a query module to overrule this ("you say it happened, I say it didn't"). If there is an error in the query side, you fix it, and replay the event.



          If it really is an error in the event handler that the whole system must know about, that is really a separate event. You can apply such an event directly on the event bus and notify the whole system. Something like this:



           @Autowired
          private EventBus eventBus;

          (...)

          CatastrophicFailureEvent failureEvent = new CatastrophicFailureEvent("OH NO!");
          eventBus.publish(GenericEventMessage.asEventMessage(failureEvent));





          share|improve this answer





























            1














            I think you might need to reconsider your architecture. Keep in mind that events should encapsulate the irreversible state changes of your system. These state changes should not be questioned after they have happened. Your query side should only need to care about projecting these valid state changes that your command side has decided on.



            If you need to check whether a user already existed, you need to do this on the command side in your aggregate. The aggregate can keep a list of all the existing usernames and throw an exception if an invalid command is given. The command response (tip: using the sendAndWait() method on the CommandGateway returns a response) can then be used as the system to inform your user about the success/failure of its action.



            The following flow might solve your problem, but keep in mind that the user will get a callback on the success of the action even though the query side might not have processed its result yet. This part is eventually consistent.



            Command Side:




            1. Request from frontend handled by a Controller class and creates an corresponding command

            2. The above command is invoked and handled by a command handler which creates the corresponding event or throws an exception if the user already exists.

            3. The invoker of the command is informed about the success of the command or the exception is handled and the error shown to the user.

            4. The above event is published through rabbit mq event bus if the command was successful.


            Query side:




            1. The event that is published in the step 4 is consumed by the event handler in query side. No checks or validations should be necessary, since they were already handled on the command side.






            share|improve this answer





























              0














              @Mzzl
              Series of activities



              Command Side:



              1. Request from frontend handled by a Controller class and creates an corresponding command
              2. The above command is invoked and handled by a command handler which in return create corresponding event
              3. The above event is then published through rabbit mq event bus.


              Query Side:



              4. The event that is published in the step 3 is consumed by the event handler in query side.
              5. The event handler has the logic to perform db transaction (lets assume add a user). Once a user is added then a success message or failure message (lets assume user already available in the DB so could not create duplicate entry) should flow from query side to command side and eventually back to UI as a repsonse.





              share|improve this answer























              • If you have a new question, please ask it by clicking the Ask Question button. Include a link to this question if it helps provide context. - From Review
                – common sense
                Nov 27 '18 at 10:01










              • @Mzzl can you please help with above query?
                – Jaspal
                Nov 28 '18 at 11:24



















              0














              I'm not sure I've fully understand your issue (especially the microservice part :)),
              but if your problem is related to having the query side up to date after the command execution, then you can have a look at this project.



              In this example, you can see that he uses a SubscriptionQueryResult in conjunction with a QueryUpdateEmitter (see here)



              Basically you will subscribe to query side changes before the command is issued, and you will block after the command execution until the query side send a notification when it is up to date.



              This way you can avoid the eventual consistency.






              share|improve this answer





















                Your Answer






                StackExchange.ifUsing("editor", function () {
                StackExchange.using("externalEditor", function () {
                StackExchange.using("snippets", function () {
                StackExchange.snippets.init();
                });
                });
                }, "code-snippets");

                StackExchange.ready(function() {
                var channelOptions = {
                tags: "".split(" "),
                id: "1"
                };
                initTagRenderer("".split(" "), "".split(" "), channelOptions);

                StackExchange.using("externalEditor", function() {
                // Have to fire editor after snippets, if snippets enabled
                if (StackExchange.settings.snippets.snippetsEnabled) {
                StackExchange.using("snippets", function() {
                createEditor();
                });
                }
                else {
                createEditor();
                }
                });

                function createEditor() {
                StackExchange.prepareEditor({
                heartbeatType: 'answer',
                autoActivateHeartbeat: false,
                convertImagesToLinks: true,
                noModals: true,
                showLowRepImageUploadWarning: true,
                reputationToPostImages: 10,
                bindNavPrevention: true,
                postfix: "",
                imageUploader: {
                brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                allowUrls: true
                },
                onDemand: true,
                discardSelector: ".discard-answer"
                ,immediatelyShowMarkdownHelp:true
                });


                }
                });














                draft saved

                draft discarded


















                StackExchange.ready(
                function () {
                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53413637%2faxon-framework-synchronous-response%23new-answer', 'question_page');
                }
                );

                Post as a guest















                Required, but never shown

























                4 Answers
                4






                active

                oldest

                votes








                4 Answers
                4






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes









                1














                I think that what you are asking is if there is a way for the command and event to be processed in a single transaction?



                If you use a subscribing event processor, running in the same JVM, the event is processed synchronously and the whole transaction is rolled back in case of an exception in an event handler. This is not the case here, because you have loosely coupled separate services, which is good.



                It's best practice for the aggregate with the command handler to have all the information available to decide whether or not the command can successfully be processed, and when an event is applied, this is a signal that it has happened, and the other services (the query side in this case) have to be informed. It's not good practice for a query module to overrule this ("you say it happened, I say it didn't"). If there is an error in the query side, you fix it, and replay the event.



                If it really is an error in the event handler that the whole system must know about, that is really a separate event. You can apply such an event directly on the event bus and notify the whole system. Something like this:



                 @Autowired
                private EventBus eventBus;

                (...)

                CatastrophicFailureEvent failureEvent = new CatastrophicFailureEvent("OH NO!");
                eventBus.publish(GenericEventMessage.asEventMessage(failureEvent));





                share|improve this answer


























                  1














                  I think that what you are asking is if there is a way for the command and event to be processed in a single transaction?



                  If you use a subscribing event processor, running in the same JVM, the event is processed synchronously and the whole transaction is rolled back in case of an exception in an event handler. This is not the case here, because you have loosely coupled separate services, which is good.



                  It's best practice for the aggregate with the command handler to have all the information available to decide whether or not the command can successfully be processed, and when an event is applied, this is a signal that it has happened, and the other services (the query side in this case) have to be informed. It's not good practice for a query module to overrule this ("you say it happened, I say it didn't"). If there is an error in the query side, you fix it, and replay the event.



                  If it really is an error in the event handler that the whole system must know about, that is really a separate event. You can apply such an event directly on the event bus and notify the whole system. Something like this:



                   @Autowired
                  private EventBus eventBus;

                  (...)

                  CatastrophicFailureEvent failureEvent = new CatastrophicFailureEvent("OH NO!");
                  eventBus.publish(GenericEventMessage.asEventMessage(failureEvent));





                  share|improve this answer
























                    1












                    1








                    1






                    I think that what you are asking is if there is a way for the command and event to be processed in a single transaction?



                    If you use a subscribing event processor, running in the same JVM, the event is processed synchronously and the whole transaction is rolled back in case of an exception in an event handler. This is not the case here, because you have loosely coupled separate services, which is good.



                    It's best practice for the aggregate with the command handler to have all the information available to decide whether or not the command can successfully be processed, and when an event is applied, this is a signal that it has happened, and the other services (the query side in this case) have to be informed. It's not good practice for a query module to overrule this ("you say it happened, I say it didn't"). If there is an error in the query side, you fix it, and replay the event.



                    If it really is an error in the event handler that the whole system must know about, that is really a separate event. You can apply such an event directly on the event bus and notify the whole system. Something like this:



                     @Autowired
                    private EventBus eventBus;

                    (...)

                    CatastrophicFailureEvent failureEvent = new CatastrophicFailureEvent("OH NO!");
                    eventBus.publish(GenericEventMessage.asEventMessage(failureEvent));





                    share|improve this answer












                    I think that what you are asking is if there is a way for the command and event to be processed in a single transaction?



                    If you use a subscribing event processor, running in the same JVM, the event is processed synchronously and the whole transaction is rolled back in case of an exception in an event handler. This is not the case here, because you have loosely coupled separate services, which is good.



                    It's best practice for the aggregate with the command handler to have all the information available to decide whether or not the command can successfully be processed, and when an event is applied, this is a signal that it has happened, and the other services (the query side in this case) have to be informed. It's not good practice for a query module to overrule this ("you say it happened, I say it didn't"). If there is an error in the query side, you fix it, and replay the event.



                    If it really is an error in the event handler that the whole system must know about, that is really a separate event. You can apply such an event directly on the event bus and notify the whole system. Something like this:



                     @Autowired
                    private EventBus eventBus;

                    (...)

                    CatastrophicFailureEvent failureEvent = new CatastrophicFailureEvent("OH NO!");
                    eventBus.publish(GenericEventMessage.asEventMessage(failureEvent));






                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Nov 22 '18 at 2:21









                    Mzzl

                    2,0891430




                    2,0891430

























                        1














                        I think you might need to reconsider your architecture. Keep in mind that events should encapsulate the irreversible state changes of your system. These state changes should not be questioned after they have happened. Your query side should only need to care about projecting these valid state changes that your command side has decided on.



                        If you need to check whether a user already existed, you need to do this on the command side in your aggregate. The aggregate can keep a list of all the existing usernames and throw an exception if an invalid command is given. The command response (tip: using the sendAndWait() method on the CommandGateway returns a response) can then be used as the system to inform your user about the success/failure of its action.



                        The following flow might solve your problem, but keep in mind that the user will get a callback on the success of the action even though the query side might not have processed its result yet. This part is eventually consistent.



                        Command Side:




                        1. Request from frontend handled by a Controller class and creates an corresponding command

                        2. The above command is invoked and handled by a command handler which creates the corresponding event or throws an exception if the user already exists.

                        3. The invoker of the command is informed about the success of the command or the exception is handled and the error shown to the user.

                        4. The above event is published through rabbit mq event bus if the command was successful.


                        Query side:




                        1. The event that is published in the step 4 is consumed by the event handler in query side. No checks or validations should be necessary, since they were already handled on the command side.






                        share|improve this answer


























                          1














                          I think you might need to reconsider your architecture. Keep in mind that events should encapsulate the irreversible state changes of your system. These state changes should not be questioned after they have happened. Your query side should only need to care about projecting these valid state changes that your command side has decided on.



                          If you need to check whether a user already existed, you need to do this on the command side in your aggregate. The aggregate can keep a list of all the existing usernames and throw an exception if an invalid command is given. The command response (tip: using the sendAndWait() method on the CommandGateway returns a response) can then be used as the system to inform your user about the success/failure of its action.



                          The following flow might solve your problem, but keep in mind that the user will get a callback on the success of the action even though the query side might not have processed its result yet. This part is eventually consistent.



                          Command Side:




                          1. Request from frontend handled by a Controller class and creates an corresponding command

                          2. The above command is invoked and handled by a command handler which creates the corresponding event or throws an exception if the user already exists.

                          3. The invoker of the command is informed about the success of the command or the exception is handled and the error shown to the user.

                          4. The above event is published through rabbit mq event bus if the command was successful.


                          Query side:




                          1. The event that is published in the step 4 is consumed by the event handler in query side. No checks or validations should be necessary, since they were already handled on the command side.






                          share|improve this answer
























                            1












                            1








                            1






                            I think you might need to reconsider your architecture. Keep in mind that events should encapsulate the irreversible state changes of your system. These state changes should not be questioned after they have happened. Your query side should only need to care about projecting these valid state changes that your command side has decided on.



                            If you need to check whether a user already existed, you need to do this on the command side in your aggregate. The aggregate can keep a list of all the existing usernames and throw an exception if an invalid command is given. The command response (tip: using the sendAndWait() method on the CommandGateway returns a response) can then be used as the system to inform your user about the success/failure of its action.



                            The following flow might solve your problem, but keep in mind that the user will get a callback on the success of the action even though the query side might not have processed its result yet. This part is eventually consistent.



                            Command Side:




                            1. Request from frontend handled by a Controller class and creates an corresponding command

                            2. The above command is invoked and handled by a command handler which creates the corresponding event or throws an exception if the user already exists.

                            3. The invoker of the command is informed about the success of the command or the exception is handled and the error shown to the user.

                            4. The above event is published through rabbit mq event bus if the command was successful.


                            Query side:




                            1. The event that is published in the step 4 is consumed by the event handler in query side. No checks or validations should be necessary, since they were already handled on the command side.






                            share|improve this answer












                            I think you might need to reconsider your architecture. Keep in mind that events should encapsulate the irreversible state changes of your system. These state changes should not be questioned after they have happened. Your query side should only need to care about projecting these valid state changes that your command side has decided on.



                            If you need to check whether a user already existed, you need to do this on the command side in your aggregate. The aggregate can keep a list of all the existing usernames and throw an exception if an invalid command is given. The command response (tip: using the sendAndWait() method on the CommandGateway returns a response) can then be used as the system to inform your user about the success/failure of its action.



                            The following flow might solve your problem, but keep in mind that the user will get a callback on the success of the action even though the query side might not have processed its result yet. This part is eventually consistent.



                            Command Side:




                            1. Request from frontend handled by a Controller class and creates an corresponding command

                            2. The above command is invoked and handled by a command handler which creates the corresponding event or throws an exception if the user already exists.

                            3. The invoker of the command is informed about the success of the command or the exception is handled and the error shown to the user.

                            4. The above event is published through rabbit mq event bus if the command was successful.


                            Query side:




                            1. The event that is published in the step 4 is consumed by the event handler in query side. No checks or validations should be necessary, since they were already handled on the command side.







                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered Dec 4 '18 at 16:48









                            Ostecke

                            213




                            213























                                0














                                @Mzzl
                                Series of activities



                                Command Side:



                                1. Request from frontend handled by a Controller class and creates an corresponding command
                                2. The above command is invoked and handled by a command handler which in return create corresponding event
                                3. The above event is then published through rabbit mq event bus.


                                Query Side:



                                4. The event that is published in the step 3 is consumed by the event handler in query side.
                                5. The event handler has the logic to perform db transaction (lets assume add a user). Once a user is added then a success message or failure message (lets assume user already available in the DB so could not create duplicate entry) should flow from query side to command side and eventually back to UI as a repsonse.





                                share|improve this answer























                                • If you have a new question, please ask it by clicking the Ask Question button. Include a link to this question if it helps provide context. - From Review
                                  – common sense
                                  Nov 27 '18 at 10:01










                                • @Mzzl can you please help with above query?
                                  – Jaspal
                                  Nov 28 '18 at 11:24
















                                0














                                @Mzzl
                                Series of activities



                                Command Side:



                                1. Request from frontend handled by a Controller class and creates an corresponding command
                                2. The above command is invoked and handled by a command handler which in return create corresponding event
                                3. The above event is then published through rabbit mq event bus.


                                Query Side:



                                4. The event that is published in the step 3 is consumed by the event handler in query side.
                                5. The event handler has the logic to perform db transaction (lets assume add a user). Once a user is added then a success message or failure message (lets assume user already available in the DB so could not create duplicate entry) should flow from query side to command side and eventually back to UI as a repsonse.





                                share|improve this answer























                                • If you have a new question, please ask it by clicking the Ask Question button. Include a link to this question if it helps provide context. - From Review
                                  – common sense
                                  Nov 27 '18 at 10:01










                                • @Mzzl can you please help with above query?
                                  – Jaspal
                                  Nov 28 '18 at 11:24














                                0












                                0








                                0






                                @Mzzl
                                Series of activities



                                Command Side:



                                1. Request from frontend handled by a Controller class and creates an corresponding command
                                2. The above command is invoked and handled by a command handler which in return create corresponding event
                                3. The above event is then published through rabbit mq event bus.


                                Query Side:



                                4. The event that is published in the step 3 is consumed by the event handler in query side.
                                5. The event handler has the logic to perform db transaction (lets assume add a user). Once a user is added then a success message or failure message (lets assume user already available in the DB so could not create duplicate entry) should flow from query side to command side and eventually back to UI as a repsonse.





                                share|improve this answer














                                @Mzzl
                                Series of activities



                                Command Side:



                                1. Request from frontend handled by a Controller class and creates an corresponding command
                                2. The above command is invoked and handled by a command handler which in return create corresponding event
                                3. The above event is then published through rabbit mq event bus.


                                Query Side:



                                4. The event that is published in the step 3 is consumed by the event handler in query side.
                                5. The event handler has the logic to perform db transaction (lets assume add a user). Once a user is added then a success message or failure message (lets assume user already available in the DB so could not create duplicate entry) should flow from query side to command side and eventually back to UI as a repsonse.






                                share|improve this answer














                                share|improve this answer



                                share|improve this answer








                                edited Nov 27 '18 at 10:32









                                Litisqe Kumar

                                2,82641735




                                2,82641735










                                answered Nov 27 '18 at 9:43









                                Jaspal

                                1




                                1












                                • If you have a new question, please ask it by clicking the Ask Question button. Include a link to this question if it helps provide context. - From Review
                                  – common sense
                                  Nov 27 '18 at 10:01










                                • @Mzzl can you please help with above query?
                                  – Jaspal
                                  Nov 28 '18 at 11:24


















                                • If you have a new question, please ask it by clicking the Ask Question button. Include a link to this question if it helps provide context. - From Review
                                  – common sense
                                  Nov 27 '18 at 10:01










                                • @Mzzl can you please help with above query?
                                  – Jaspal
                                  Nov 28 '18 at 11:24
















                                If you have a new question, please ask it by clicking the Ask Question button. Include a link to this question if it helps provide context. - From Review
                                – common sense
                                Nov 27 '18 at 10:01




                                If you have a new question, please ask it by clicking the Ask Question button. Include a link to this question if it helps provide context. - From Review
                                – common sense
                                Nov 27 '18 at 10:01












                                @Mzzl can you please help with above query?
                                – Jaspal
                                Nov 28 '18 at 11:24




                                @Mzzl can you please help with above query?
                                – Jaspal
                                Nov 28 '18 at 11:24











                                0














                                I'm not sure I've fully understand your issue (especially the microservice part :)),
                                but if your problem is related to having the query side up to date after the command execution, then you can have a look at this project.



                                In this example, you can see that he uses a SubscriptionQueryResult in conjunction with a QueryUpdateEmitter (see here)



                                Basically you will subscribe to query side changes before the command is issued, and you will block after the command execution until the query side send a notification when it is up to date.



                                This way you can avoid the eventual consistency.






                                share|improve this answer


























                                  0














                                  I'm not sure I've fully understand your issue (especially the microservice part :)),
                                  but if your problem is related to having the query side up to date after the command execution, then you can have a look at this project.



                                  In this example, you can see that he uses a SubscriptionQueryResult in conjunction with a QueryUpdateEmitter (see here)



                                  Basically you will subscribe to query side changes before the command is issued, and you will block after the command execution until the query side send a notification when it is up to date.



                                  This way you can avoid the eventual consistency.






                                  share|improve this answer
























                                    0












                                    0








                                    0






                                    I'm not sure I've fully understand your issue (especially the microservice part :)),
                                    but if your problem is related to having the query side up to date after the command execution, then you can have a look at this project.



                                    In this example, you can see that he uses a SubscriptionQueryResult in conjunction with a QueryUpdateEmitter (see here)



                                    Basically you will subscribe to query side changes before the command is issued, and you will block after the command execution until the query side send a notification when it is up to date.



                                    This way you can avoid the eventual consistency.






                                    share|improve this answer












                                    I'm not sure I've fully understand your issue (especially the microservice part :)),
                                    but if your problem is related to having the query side up to date after the command execution, then you can have a look at this project.



                                    In this example, you can see that he uses a SubscriptionQueryResult in conjunction with a QueryUpdateEmitter (see here)



                                    Basically you will subscribe to query side changes before the command is issued, and you will block after the command execution until the query side send a notification when it is up to date.



                                    This way you can avoid the eventual consistency.







                                    share|improve this answer












                                    share|improve this answer



                                    share|improve this answer










                                    answered Dec 12 '18 at 22:11









                                    Sylvain

                                    456414




                                    456414






























                                        draft saved

                                        draft discarded




















































                                        Thanks for contributing an answer to Stack Overflow!


                                        • Please be sure to answer the question. Provide details and share your research!

                                        But avoid



                                        • Asking for help, clarification, or responding to other answers.

                                        • Making statements based on opinion; back them up with references or personal experience.


                                        To learn more, see our tips on writing great answers.





                                        Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                                        Please pay close attention to the following guidance:


                                        • Please be sure to answer the question. Provide details and share your research!

                                        But avoid



                                        • Asking for help, clarification, or responding to other answers.

                                        • Making statements based on opinion; back them up with references or personal experience.


                                        To learn more, see our tips on writing great answers.




                                        draft saved


                                        draft discarded














                                        StackExchange.ready(
                                        function () {
                                        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53413637%2faxon-framework-synchronous-response%23new-answer', 'question_page');
                                        }
                                        );

                                        Post as a guest















                                        Required, but never shown





















































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown

































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown







                                        Popular posts from this blog

                                        404 Error Contact Form 7 ajax form submitting

                                        How to know if a Active Directory user can login interactively

                                        TypeError: fit_transform() missing 1 required positional argument: 'X'