Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
bhalchandraswcg
Contributor

Previous – Messaging Bridge | Index | Next – Control Bus


This week, we'll study a pattern known as Message Bus.

When do I use this pattern?


Message Bus is useful where multiple applications providing similar functionality are involved. For example, in a merger of businesses, the two companies may use different software for holding products information. A message bus will receive product request data and pass it to the appropriate system. Choosing the appropriate system requires the use of a Message Router. Whereas, sending the product request to the chosen system can be done through Command Message. If the end system does not understand messaging, then a Channel Adapter could be used. Message Bus is this combined effort of different patterns to expose one common interface while keeping the participating systems lowly coupled to each other such that any system could be added/removed easily with future mergers/liquidations.

Message Bus in CPI


In the example, I will connect to Northwind system and SAP ES5 system to expose the products API.

Integration Flow



Fetch Product Information


This integration flow exposes the API using HTTPS Sender Adapter. The configuration of the HTTPS Sender Adapter is as follows:


















Tab Property Value
Connection Address /Products
Connection CSRF Protected Unchecked

The Content Modifier is used to move the header value of ProductName into an exchange property.

The first Content Enricher connects to Northwind Service using OData Receiver Adapter and fetches product information. The configuration of this OData Receiver Adapter is as follows:

































Tab Property Value
Connection Address https://services.odata.org/V2/Northwind/Northwind.svc
Connection CSRF Protected Unchecked

Processing
Operation Details Query (GET)

Processing
Resource Path Products


Processing

Query Options $filter=ProductName eq ${property.ProductName}

The second Content Enricher connects to SAP ES5 server using OData Receiver Adapter and fetches product information. The configuration of this OData Receiver Adapter is as follows:











































Tab Property Value
Connection Address https://sapes5.sapdevcenter.com/sap/opu/odata/sap/EPM_REF_APPS_PROD_MAN_SRV
Connection Authentication Basic
Connection Credential Name ES5 Credentials
Connection CSRF Protected Unchecked

Processing
Operation Details Query (GET)

Processing
Resource Path Products


Processing

Query Options $filter=Name eq '${property.ProductName}'

Both Content Enrichers are configured to combine the message as it is.

A Message Translator can be added after all Content Enrichers to convert the response into a Canonical Data Model.

Execution


When the API is invoked, the ProductName is received in the HTTP headers. Content Modifier moves the header into the property. Then, the flow invokes each system in sequence and whichever system has the product populates the output message body.

Output from Northwind


For example, when invoked with the header ProductName as Chai, the product is fetched from Northwind system and the output is like so:
<?xml version='1.0' encoding='UTF-8'?>
<multimap:Messages xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge">
<multimap:Message1>
<Products>
<Product>
<CategoryID>1</CategoryID>
<Discontinued>false</Discontinued>
<SupplierID>1</SupplierID>
<UnitPrice>18.0000</UnitPrice>
<ProductName>Chai</ProductName>
<QuantityPerUnit>10 boxes x 20 bags</QuantityPerUnit>
<UnitsOnOrder>0</UnitsOnOrder>
<ProductID>1</ProductID>
<ReorderLevel>10</ReorderLevel>
<UnitsInStock>39</UnitsInStock>
</Product>
</Products>
</multimap:Message1>
<multimap:Message2>
<Products/>
</multimap:Message2>
</multimap:Messages>

Output from ES5


When the Name from ES5 is sent in the header ProductName, the product is fetched from ES5 like so:
<?xml version='1.0' encoding='UTF-8'?>
<multimap:Messages xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge">
<multimap:Message1>
<Products/>
</multimap:Message1>
<multimap:Message2>
<Products>
<Product>
<Description>Notebook Basic 15 with 2,80 GHz quad core, 15" LCD, 4 GB DDR3 RAM, 500 GB Hard Disc, Windows 8 Pro</Description>
<MainCategoryId>Computer Systems</MainCategoryId>
<StockQuantity>149</StockQuantity>
<SubCategoryId>Notebooks</SubCategoryId>
<ImageUrl>/sap/public/bc/NWDEMO_MODEL/IMAGES/HT-1000.jpg</ImageUrl>
<WeightUnit>kg</WeightUnit>
<DimensionUnit>cm</DimensionUnit>
<DimensionHeight>3</DimensionHeight>
<Name>Notebook Basic 15</Name>
<CurrencyCode>USD</CurrencyCode>
<SubCategoryName>Notebooks</SubCategoryName>
<LastModified>2020-12-27T03:01:02.000</LastModified>
<SupplierId>100000000</SupplierId>
<DimensionWidth>30</DimensionWidth>
<MeasureUnit>each</MeasureUnit>
<WeightMeasure>4.2</WeightMeasure>
<MainCategoryName>Computer Systems</MainCategoryName>
<SupplierName>SAP</SupplierName>
<Price>956.00</Price>
<RatingCount>3</RatingCount>
<AverageRating>3.67</AverageRating>
<Id>HT-1000</Id>
<DimensionDepth>18</DimensionDepth>
<QuantityUnit>EA</QuantityUnit>
</Product>
</Products>
</multimap:Message2>
</multimap:Messages>

EIPinCPI Rating - 10/10


With the solid support of component patterns, Message Bus pattern gets full 10 out of 10.

Conclusion


Message Bus pattern is a combination of other patterns that enables connecting multiple systems providing a similar system in a low coupled way.

References/Further Readings



Hope this helps,
Bala

Previous – Messaging Bridge | Index | Next – Control Bus

Labels in this area