Introduction
Consider a situation where a BizTalk message itself will have the routing information for the message. In such cases, one needs to create a Dynamic Port. In a Dynamic Port, the destination location is specified during runtime. This feature of Ports comes in very handy when one has to make routing decisions at runtime based on the content of the message.
Example - Message Segregation
A custom message "message.xsd" has the following properties:
ID
- Holds an integer value used to categorize a message.
Data
- The contents of the message.
Destination
- Holds the routing information for the message.
Initiator
- Specifies the initiator of the message.
Let us set some rules based on the "ID
" property of the message.
- All messages with ID between 200 to 299, need to be processed as High Priority messages.
- All messages with ID between 300 to 399, need to be processed as Low Priority messages.
- All messages with ID greater than 400 can be ignored.
Creating the BizTalk Project - "DynamicFilePorts"
Create a new BizTalk Server Project in Visual Studio .NET.
Step 1: In the Visual Studio .NET menu, select File -> New -> Project, and type the name "DynamicFilePorts".
Building the Schemas
Step 2: Right-click on the project in the Solution Explorer, and select the "Add New Item" option. Then, select the item "Schema" and name it "Message". When the schema shows up, rename the "Root
" element to "Message
". After that, create the child elements: "ID
", "Data
", "Destination
" and "Initiator
".
Message Schema Elements
Element Name |
Element Type |
ID |
xs:int |
Data |
xs:string |
Destination |
xs:string |
Initiator |
xs:string |
Please refer to the image below and confirm your schema file...
Building the Orchestration (also known as a "Business Process")
This Orchestration would have just three shapes, a Receive shape, an Expression shape, and a Send shape.
Step 3: Right-click on the project in the Solution Explorer, and select the "Add New Item" option. Then, select the item "BizTalk Orchestration" and name it "DynamicPortsDemo".
Step 4: Place the three shapes on the "Orchestration Surface".
- Receive shape
- Expression shape
- Send shape
Step 5: Create a message.
- In the Orchestration View, right-click on the Messages folder, and select "New Message". Rename it as "IncomingMessage", and in the Properties window, set the Message Type as "DynamicFilePorts.Message".
Step 6: Setting Properties for all the shapes.
- Select the Receive shape, and in the Properties window, set the Message Type as "IncomingMessage", and set the property "
Activate
" as True
.
- Select the Send shape, and in the Properties window, set the Message Type as "IncomingMessage".
- Select the Expression shape, double-click, and type the code shown below...
if (IncomingMessage.ID >= 200 && IncomingMessage.ID <= 299)
{
OutputDataPort(Microsoft.XLANGs.BaseTypes.Address) =
"FILE://C:/BiztalkProjects/DynamicFilePorts/" +
IncomingMessage.Destination +
"/HighPriorityMessage_%MessageID%.xml";
}
else if (IncomingMessage.ID >= 300 &&
IncomingMessage.ID <= 399)
{
OutputDataPort(Microsoft.XLANGs.BaseTypes.Address) =
"FILE://C:/BiztalkProjects/DynamicFilePorts/" +
IncomingMessage.Destination +
"/LowPriorityMessage_%MessageID%.xml";
}
else
{
OutputDataPort(Microsoft.XLANGs.BaseTypes.Address) =
"FILE://C:/BiztalkProjects/DynamicFilePorts/" +
IncomingMessage.Destination +
"/IgnoreMessage_%MessageID%.xml";
}
Step 7: Create two Ports (a Receive port and a Send port)
- Receive port - Right-click on the Port Surface, and select "New Configured Port", and set the
Name
as "InputDataPort", leave all the default properties as it is in the Wizard.
- Send Port - Right-click on the Port Surface, and select "New Configured Port", and set
Name
as "OutputDataPort", set the remaining properties as shown in the image below...
Step 8: Strong name and deployment!!
- Create a key file using "sn -k Dynamic.snk" in the Visual Studio .NET command prompt.
- In the Solution Explorer, right-click on the "DynamicFilePorts" Project Properties, and select "Assembly" and specify the key file name.
- In the Solution Explorer, right-click on the "DynamicFilePorts" Project Properties and select "Deploy".
- In the BizTalk Explorer, right-click on the listed Orchestration under the "Orchestration" folder, and select "Bind...". Create a Receive Port and a Receive Location.
In the BizTalk Explorer, right-click on the listed Orchestration under the "Orchestration" folder, and select "Start". The Orchestration icon must turn blue.
Step 9: Refresh BizTalk Explorer and create Receive Location.
- Please refer to the MSDN documentation on how to create a Send Port and Receive Locations.
Step 10: Test the Solution
- Create the folders "InputFiles", "InstantProcessing", "LowPriority", and "Ignore" under any directory. Place the input file in the Receive Location. Check the response in any of the folders based on the input message.
- Note that the input file is routed to the destination folder according to the "ID" of the message.
Quick Takeaways
- Always set the
Activate
property to "True
" for the first Receive Shape in the orchestration.
- Note the use of
if-else
conditions used directly in the "Expression" shape, instead of using a "Decide" shape.
- Content based routing can also be done using filters in Send Ports.
- A BizTalk service needs to be re-started every time a deployment is done.