Technical Articles
EIPinCPI – Message Store
Previous – Message History | Index | Next – Smart Proxy
This week, I’ll explore a system management pattern known as Message Store.
When do I use this pattern?
Message Store is used to persist the message or parts of it for reporting and analytics purpose. The Message can be stored in the persistence using a Wire Tap or by using a dedicated step.
Message Store in CPI
Storing the Message
In CPI, the message can be stored in Message Store using Persist step like so:
Persist
This flow starts immediately using the Timer Start Event, then Content Modifier step sets a Header, a Property, and the body of the message. Finally, Persist step will persist the message into the Message Store.
Accessing the Message
The persisted message can be accessed using CPI’s OData API.
Fetch the Message ID
First, let’s run the flow. When the flow is deployed we can view the Message ID in monitoring.
Deployed
Get the Message Store Entry using the Message ID
Now, I can use the Message ID to fetch the message store entries by running HTTP GET on the URL:
https://<Tenant>/api/v1/MessageProcessingLogs(‘<Message ID>’)/MessageStoreEntries
Example output is like below. Here, we can see the entry for the Persist step from the flow.
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xml:base="https://<Tenant>:443/api/v1/">
<id>https://<Tenant>:443/api/v1/MessageStoreEntries</id>
<title type="text">MessageStoreEntries</title>
<updated>2021-01-31T15:27:57.116Z</updated>
<author>
<name/>
</author>
<link href="MessageStoreEntries" rel="self" title="MessageStoreEntries"/>
<entry>
<id>https://<Tenant>:443/api/v1/MessageStoreEntries('sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b')</id>
<title type="text">MessageStoreEntries</title>
<updated>2021-01-31T15:27:57.116Z</updated>
<category term="com.sap.hci.api.MessageStoreEntry" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
<link href="MessageStoreEntries('sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b')" rel="edit" title="MessageStoreEntry"/>
<link href="MessageStoreEntries('sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b')/$value" rel="edit-media" type="application/octet-stream"/>
<link href="MessageStoreEntries('sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b')/Attachments" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Attachments" title="Attachments" type="application/atom+xml;type=feed"/>
<link href="MessageStoreEntries('sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b')/Properties" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Properties" title="Properties" type="application/atom+xml;type=feed"/>
<content type="application/octet-stream" src="MessageStoreEntries('sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b')/$value"/>
<m:properties>
<d:Id>sap-it-res:msg:a237a07a6:d8402-e38e-4d13-9567-998eb2af638b</d:Id>
<d:MessageGuid>AGAWw8xxrAL7yJjy8kCGivUFXGQH</d:MessageGuid>
<d:MessageStoreId>Persist</d:MessageStoreId>
<d:TimeStamp>2021-01-31T14:50:52.396</d:TimeStamp>
<d:HasAttachments>false</d:HasAttachments>
</m:properties>
</entry>
</feed>
Get the Body of the Message
The body of the message can be viewed by visiting the /$value path
https://<Tenant>/api/v1/MessageProcessingLogs(‘<Message ID>’)/MessageStoreEntries(‘sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b’)/$value
The example output could be:
<Body />
Get the Headers of the Message
The headers are available at the /Properties path
https://<Tenant>/api/v1/MessageProcessingLogs(‘<Message ID>’)/MessageStoreEntries(‘sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b’)/Properties
The example output is like below. Here, we can see standard headers like SAP_MplCorrelationId, SAP_PreGeneratedMplId, and SAP_MessageProcessingLogID. Custom header ‘Header’ is also listed here.
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xml:base="https://<Tenant>:443/api/v1/">
<id>https://<Tenant>:443/api/v1/MessageStoreEntryProperties</id>
<title type="text">MessageStoreEntryProperties</title>
<updated>2021-01-31T15:36:33.128Z</updated>
<author>
<name/>
</author>
<link href="MessageStoreEntryProperties" rel="self" title="MessageStoreEntryProperties"/>
<entry>
<id>https://<Tenant>:443/api/v1/MessageStoreEntryProperties(MessageId='sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b',Name='SAP_MplCorrelationId')</id>
<title type="text">MessageStoreEntryProperties</title>
<updated>2021-01-31T15:36:33.128Z</updated>
<category term="com.sap.hci.api.MessageStoreEntryProperty" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
<link href="MessageStoreEntryProperties(MessageId='sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b',Name='SAP_MplCorrelationId')" rel="edit" title="MessageStoreEntryProperty"/>
<content type="application/xml">
<m:properties>
<d:MessageId>sap-it-res:msg:a237a07a6:d8402-e38e-4d13-9567-998eb2af638b</d:MessageId>
<d:Name>SAP_MplCorrelationId</d:Name>
<d:Value>AGAWw8whkIvH4abnnWdrJ8C12kO_</d:Value>
</m:properties>
</content>
</entry>
<entry>
<id>https://<Tenant>:443/api/v1/MessageStoreEntryProperties(MessageId='sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b',Name='Header')</id>
<title type="text">MessageStoreEntryProperties</title>
<updated>2021-01-31T15:36:33.129Z</updated>
<category term="com.sap.hci.api.MessageStoreEntryProperty" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
<link href="MessageStoreEntryProperties(MessageId='sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b',Name='Header')" rel="edit" title="MessageStoreEntryProperty"/>
<content type="application/xml">
<m:properties>
<d:MessageId>sap-it-res:msg:a237a07a6:d8402-e38e-4d13-9567-998eb2af638b</d:MessageId>
<d:Name>Header</d:Name>
<d:Value>Value</d:Value>
</m:properties>
</content>
</entry>
<entry>
<id>https://<Tenant>:443/api/v1/MessageStoreEntryProperties(MessageId='sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b',Name='SAP_PregeneratedMplId')</id>
<title type="text">MessageStoreEntryProperties</title>
<updated>2021-01-31T15:36:33.129Z</updated>
<category term="com.sap.hci.api.MessageStoreEntryProperty" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
<link href="MessageStoreEntryProperties(MessageId='sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b',Name='SAP_PregeneratedMplId')" rel="edit" title="MessageStoreEntryProperty"/>
<content type="application/xml">
<m:properties>
<d:MessageId>sap-it-res:msg:a237a07a6:d8402-e38e-4d13-9567-998eb2af638b</d:MessageId>
<d:Name>SAP_PregeneratedMplId</d:Name>
<d:Value>AGAWw8xzG5YwLr1SYPHGi9qi_IR8</d:Value>
</m:properties>
</content>
</entry>
<entry>
<id>https://<Tenant>:443/api/v1/MessageStoreEntryProperties(MessageId='sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b',Name='SAP_MessageProcessingLogID')</id>
<title type="text">MessageStoreEntryProperties</title>
<updated>2021-01-31T15:36:33.129Z</updated>
<category term="com.sap.hci.api.MessageStoreEntryProperty" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
<link href="MessageStoreEntryProperties(MessageId='sap-it-res%3Amsg%3Aa237a07a6%3Ad8402-e38e-4d13-9567-998eb2af638b',Name='SAP_MessageProcessingLogID')" rel="edit" title="MessageStoreEntryProperty"/>
<content type="application/xml">
<m:properties>
<d:MessageId>sap-it-res:msg:a237a07a6:d8402-e38e-4d13-9567-998eb2af638b</d:MessageId>
<d:Name>SAP_MessageProcessingLogID</d:Name>
<d:Value>AGAWw8xxrAL7yJjy8kCGivUFXGQH</d:Value>
</m:properties>
</content>
</entry>
</feed>
Please note that here the path /Properties does not mean Exchange Properties, the path /Properties stores headers of the message.
If other standard headers for the sender, receiver, message type, application id are populated before persisting, then, using UI5 it will be easy to build reports based on these factors. For example, finding out the number of messages by a given sender of a given message type.
EIPinCPI Rating – 10/10
CPI has dedicated step and OData API to access the Message Store. Therefore, a complete 10 out of 10 rating is given.
Conclusion
Message Store is used for storing the message for reporting or analytics purpose.
References/Further Readings
- Message Store Pattern in Enterprise Integration Patterns
- EIPinCPI
- CPI Components
Hope this helps,
Bala