Changes for page Asynchronous Routing
Last modified by Danniar Firdausy on 2024/09/04 09:01
From version 15.1
edited by eMagiz
on 2022/05/10 11:13
on 2022/05/10 11:13
Change comment:
There is no comment for this version
To version 22.1
edited by Erik Bakker
on 2022/08/15 08:07
on 2022/08/15 08:07
Change comment:
There is no comment for this version
Summary
-
Page properties (5 modified, 0 added, 0 removed)
Details
- Page properties
-
- Title
-
... ... @@ -1,0 +1,1 @@ 1 +Asynchronous Routing - Parent
-
... ... @@ -1,0 +1,1 @@ 1 +WebHome - Author
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki. marijn1 +XWiki.ebakker - Default language
-
... ... @@ -1,0 +1,1 @@ 1 +en - Content
-
... ... @@ -1,20 +1,8 @@ 1 -{{html wiki="true"}} 2 -<div class="ez-academy"> 3 - <div class="ez-academy_body"> 4 - 5 -<div class="doc"> 6 - 7 - 8 - 9 -= Asynchronous Routing = 10 - 1 +{{container}}{{container layoutStyle="columns"}}((( 11 11 In this microlearning, we will explain the basics of asynchronous routing that plays a vital role in the distribution of messages within the five-layer model of messaging. 12 12 13 -Should you have any questions, please contact academy@emagiz.com. 4 +Should you have any questions, please contact [[academy@emagiz.com>>mailto:academy@emagiz.com]]. 14 14 15 -* Last update: February 25th, 2021 16 -* Required reading time: 7 minutes 17 - 18 18 == 1. Prerequisites == 19 19 20 20 * Basic knowledge of the eMagiz platform ... ... @@ -30,8 +30,6 @@ 30 30 * Based on a decision made within the routing the message is routed to one or more offramp queues 31 31 * Each offramp queue will receive data based on the decision unless you add another filter before the messages are sent to the offramp queue 32 32 33 - 34 - 35 35 == 3. Asynchronous routing == 36 36 37 37 Asynchronous routing plays a crucial role in the distribution of messages it receives to one or more offramps. ... ... @@ -53,19 +53,19 @@ 53 53 54 54 This SpEL expression does the following things: 55 55 56 - 1.It looks for the header called {technicalnameofproject}\_targetSystem and will split each entry based on the separator (a comma)57 - 2.It will trim the result of this split and combine it the value in the header called {technicalnameofproject}\_messageType58 - 3.For every unique combination it will search to a pre-configured list to see to which channel the message should be sent42 +* It looks for the header called {technicalnameofproject}\_targetSystem and will split each entry based on the separator (a comma) 43 +* It will trim the result of this split and combine it the value in the header called {technicalnameofproject}\_messageType 44 +* For every unique combination it will search to a pre-configured list to see to which channel the message should be sent 59 59 60 60 In the standard router component this will look as follows: 61 61 62 - <p align="center">[[image:crashcourse-messaging-asynchronous-routing--routing-decision.png||]]</p>48 +[[image:Main.Images.Microlearning.WebHome@crashcourse-messaging-asynchronous-routing--routing-decision.png]] 63 63 64 64 In this simple case, we only have one channel as a result because all routings start simple. 65 65 The moment you add new offramps to your project you need to add the new entry(s) to this list. 66 66 Doing so is easy when you are in Start Editing Mode. Simply open the router component and select the button New Mapping 67 67 68 - <p align="center">[[image:crashcourse-messaging-asynchronous-routing--new-value-mapping.png||]]</p>54 +[[image:Main.Images.Microlearning.WebHome@crashcourse-messaging-asynchronous-routing--new-value-mapping.png]] 69 69 70 70 In here you fill in the correct unique combination of a target system and the message type and select the channel you want to route the message to. 71 71 When you are satisfied you can press Save and the new entry will be registered in eMagiz. ... ... @@ -74,26 +74,20 @@ 74 74 75 75 === 3.2 Control output === 76 76 77 -As the asynchronous plays a role in routing messages between all asynchronous flows in a 78 -the messaging solution you can imagine that making changes does not need to happen lightly. 79 -The other aspect is that when multiple projects are being built at the same time the asynchronous routing 80 -will house a multitude of changes that need to go to Acceptance or Production at the same time. 63 +As the asynchronous plays a role in routing messages between all asynchronous flows in the messaging solution you can imagine that making changes does not need to happen lightly. The other aspect is that when multiple projects are being built at the same time the asynchronous routing will house a multitude of changes that need to go to Acceptance or Production at the same time. 81 81 82 -One control mechanism we consider a best practice to guard yourself against those risks is to add a filter 83 -before data is placed on the offramp queue. 84 -By doing this consistently you can control when a specific offramp can receive data on any environment. 85 -In other words, when a certain system is not ready yet to receive data on Acceptance or Production but is ready on Test 86 -you can control this behavior with this solution. 65 +One control mechanism we consider a best practice to guard yourself against those risks is to add a filter before data is placed on the offramp queue. 66 +By doing this consistently you can control when a specific offramp can receive data on any environment. In other words, when a certain system is not ready yet to receive data on Acceptance or Production but is ready on Test you can control this behavior with this solution. 87 87 88 88 Below you see how this will look on flow level. 89 89 90 - <p align="center">[[image:crashcourse-messaging-asynchronous-routing--filter-construction.png||]]</p>70 +[[image:Main.Images.Microlearning.WebHome@crashcourse-messaging-asynchronous-routing--filter-construction.png]] 91 91 92 92 When we zoom in on the filter component we see a simple SpEL expression that checks the value of a certain property. 93 93 When the value of the property is true the message can pass. If the value of the property is any other value the message will be halted. 94 94 The best practice would be to work with false to get clarity on what the intended use of the property value is. 95 95 96 - <p align="center">[[image:crashcourse-messaging-asynchronous-routing--filter-configuration.png||]]</p>76 +[[image:Main.Images.Microlearning.WebHome@crashcourse-messaging-asynchronous-routing--filter-configuration.png]] 97 97 98 98 === 3.4 Step by step guide === 99 99 ... ... @@ -102,19 +102,17 @@ 102 102 103 103 Steps to follow when adding an integration to the routing Part I: 104 104 105 - 1.Add a header in the onramp named {technicalnameofproject}\_targetSystem (if this is not done yet)106 - 2.Fill this header with a value that should be defined as a property (naming convention = systemname.messagetype.targetsystems)107 - 3.This property should be created in Test, Accp, and Prod and filled with all target systems for a certain message type (notation = systemname1,systemname2,systemname3)108 - 4.In the routing a standard router should be used as the first building block after receiving the input.85 +* Add a header in the onramp named {technicalnameofproject}\_targetSystem (if this is not done yet) 86 +* Fill this header with a value that should be defined as a property (naming convention = systemname.messagetype.targetsystems) 87 +* This property should be created in Test, Accp, and Prod and filled with all target systems for a certain message type (notation = systemname1,systemname2,systemname3) 88 +* In the routing a standard router should be used as the first building block after receiving the input. 109 109 110 110 Part II 111 111 112 -5. In this standard router a SpelExpression has to be defined **once** that concatenates the following headers: {technicalnameofproject}\_targetSystem and {technicalnameofproject}\_messageType. 113 -6. For every unique combination there is a value that should be specified alongside the channel on which to put the message (this should be a channel that ultimately leads to the correct offramp queue) 114 -7. For every channel that leads to a JMS outbound channel adapter a filter needs to be added to make sure that each output option can be turned on or off easily. 115 - This to prevent that messages are sent to a system that does not expect them then 116 - 8 This filter should look like this: '${routing.monitor.detorem.enabled}' == 'true'. 117 - The naming convention of said property is routing.targetsystem.messagetype.enabled. 92 +* In this standard router a SpelExpression has to be defined **once** that concatenates the following headers: {technicalnameofproject}\_targetSystem and {technicalnameofproject}\_messageType. 93 +* For every unique combination there is a value that should be specified alongside the channel on which to put the message (this should be a channel that ultimately leads to the correct offramp queue) 94 +* For every channel that leads to a JMS outbound channel adapter a filter needs to be added to make sure that each output option can be turned on or off easily. This to prevent that messages are sent to a system that does not expect them then 95 +* This filter should look like this: '${routing.monitor.detorem.enabled}' == 'true'. The naming convention of said property is routing.targetsystem.messagetype.enabled. 118 118 119 119 === 3.5 The result === 120 120 ... ... @@ -121,9 +121,8 @@ 121 121 The result of setting up your asynchronous routing in this manner 122 122 is that you have one single point of entry, one single piece of decision logic, and a way to control the output per specific output channel. 123 123 124 - <p align="center">[[image:crashcourse-messaging-asynchronous-routing--simple-asynchronous-routing-example.png||]]</p>102 +[[image:Main.Images.Microlearning.WebHome@crashcourse-messaging-asynchronous-routing--simple-asynchronous-routing-example.png]] 125 125 126 -===== Practice ===== 127 127 128 128 == 4. Assignment == 129 129 ... ... @@ -136,8 +136,6 @@ 136 136 * Control the output with a filter to prevent data to be sent to a queue too early 137 137 * Use the annotations to write down the step by step guide within your asynchronous routing 138 138 139 - 140 - 141 141 == 6. Suggested Additional Readings == 142 142 143 143 If you are interested in this topic and want more information on it please read the help text provided by eMagiz. ... ... @@ -146,10 +146,6 @@ 146 146 147 147 This video demonstrates how you could have handled the assignment and gives you some context on what you have just learned. 148 148 149 - <iframewidth="1280" height="720" src="../../vid/microlearning/crashcourse-messaging-asynchronous-routing.mp4"frameborder="0"allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>124 +{{video attachment="crashcourse-messaging-asynchronous-routing.mp4" reference="Main.Videos.Microlearning.WebHome"/}} 150 150 151 -</div> 152 -</div> 153 -</div> 154 - 155 -{{/html}} 126 +)))((({{toc/}}))){{/container}}{{/container}}