Introduction
One of my connection on Linkedin asked for help
In last post Batching(Aggregating) messages in Logic App we saw how to group JSON messages, in this post let's see how to batch XML message.
One of the primary thing to consider is valid that XML document has single Root Node.
We would create two logic app 1. XMLBatchProcessor 2. BatchProcessCaller
So basically his requirement is to send all the individual records in a group to CRM endpoint i.e. a Batch of individual records. This is called Aggregator or Batching pattern in Integration.
When we say we want to group messages then comes a question as to how to wrap them.In BizTalk we handle such scenario with help of Envelope schema (for Debatching and Batching).
In logic app there is a special trigger for grouping of the messages - Batch trigger.
In last post Batching(Aggregating) messages in Logic App we saw how to group JSON messages, in this post let's see how to batch XML message.
One of the primary thing to consider is valid that XML document has single Root Node.
We would create two logic app 1. XMLBatchProcessor 2. BatchProcessCaller
Steps to implement Aggregator/Batching Pattern in Logic App
1. Create a XMLBatchProcessor Logic App
From the Azure Portal select Create a resource -> search of “Logic App” -> click Create button
After instance is created, go to logic app designer and to add trigger - search for Batch. Select the Batch message trigger and configure batch process trigger .
- Batch Mode
Here we have two option
- Inline: For defining release criteria inside the batch trigger itself (for this post am using this - it's kind of hard coding).
IMO This should be opted if you don't have integration account or you have limited batch processing requirement.
- Integration Account: Ideally, this is should be preferred, as it helps for defining multiple release criteria configurations and also you don't have to make updates in Logic app every time release criteria is changed . It is like a configuration file sitting in an integration account,so you can maintain these configurations all in one place rather than in separate logic apps
- Batch Name
The name for your batch, which is "CommonBatch" in this example and applies only to Inline batch mode
- Release Criteria
As we have used Inline batch mode, we need to select the criteria to meet before processing each batch (we can select multiple criteria also):
- Message count based: Release the batch based on the number of messages collected by the batch.
- Size based: Release the batch based on the total size in bytes for all messages collected by that batch.
- Schedule: Release the batch based on a recurrence schedule, which specifies an interval and frequency. In the advanced options, you can also select a time zone and provide a start date and time.
- Select all: Use all the specified criteria.
Here Message count is selected with count as 3
Now, what you want to do with Batched Message?
We want to wrap this group of xml messages with a Root element tag, so that we get a valid XML Batched message and then finally can send it to the required destination for further processing.
So how we do it -- one option would be to create Azure Function - you will have to write code which will accept the Batched items and return new batched message. And call this function from your logic app.
Another would be to use Inline code - but it is still in preview and currently only supports Java Script.
Here we will make use of string Variable, using which we do following
Initialize variable with Start tag <RootNode>
So after the Batch Trigger step , add new action and select variable
Select Initialize variable
Give the Variable a Name , String as Datatype and against Value provide the start tag you want , here <BatchedMessages> is used
Keep on appending each Batched Item
Now add new action -- Append to string variable
Select Message Content of BatchedItems which is output of BatchTrigger step as a value to append. Note that For each gets automatically added.
Close the Rootnode tag </RootNode>
Next again we add Append Variable action after Foreach and add closing tag to it.
And now the final step is to send to destination -- for this post have used Send email action with attachment
Note : Batch trigger is a special trigger meant for collecting messages and it only starts the instance once it's release condition is met - so you won't see it's instance in run history till it reaches it's release point.
Also you would not be able to call it outside of your subscription or from different region.
2. Create a caller Logic App
From the Azure Portal select Create a resource -> search of “Logic App” -> click Create button.
In designer select http tigger and in next action search for Batch, you should see all the logic apps which have Batchtrigger, select the one created in above step.
As soon as you select it, Trigger Name and Workflow will be auto populated, against Batch Name give the same name used in step 1 and for Message content provide triggerbody.
That's it, ready to use.
Testing
Using Postman, sent 3 request(xml) having order details in it in it to the BatchProcessCaller logic app
Related Post
- Logic Apps : For Each Inside a For Each - Fetching values from field in an array inside an array
- Getting Started with Logic Apps - Enterprise Application Integration
- Getting Started with Logic Apps - EDI X12 Fundamentals
- Getting Started with Logic Apps - Fundamentals
- Getting Started with Logic Apps - AS2
- Getting Started with Logic Apps - XML to EDI X12