Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

How to create a self-routing message using Dynamic Ports in BizTalk Server 2004

0.00/5 (No votes)
1 Mar 2006 1  
This article describes how to create a self-routing message using Dynamic Ports in BizTalk Server 2004.

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".

NewProjectDialog

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...

MessageSchema

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".

DP_Orchestration

Step 4: Place the three shapes on the "Orchestration Surface".

  1. Receive shape
  2. Expression shape
  3. Send shape

Step 5: Create a message.

  1. 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.

  1. Select the Receive shape, and in the Properties window, set the Message Type as "IncomingMessage", and set the property "Activate" as True.
  2. Select the Send shape, and in the Properties window, set the Message Type as "IncomingMessage".
  3. Select the Expression shape, double-click, and type the code shown below...

BizTalkExpressionEditor

// Instantly process the message.

if (IncomingMessage.ID >= 200 && IncomingMessage.ID <= 299)
{
  OutputDataPort(Microsoft.XLANGs.BaseTypes.Address) = 
      "FILE://C:/BiztalkProjects/DynamicFilePorts/" + 
      IncomingMessage.Destination + 
      "/HighPriorityMessage_%MessageID%.xml";
}
// Low Priority message processing.

else if (IncomingMessage.ID >= 300 && 
         IncomingMessage.ID <= 399)
{
  OutputDataPort(Microsoft.XLANGs.BaseTypes.Address) = 
      "FILE://C:/BiztalkProjects/DynamicFilePorts/" + 
      IncomingMessage.Destination + 
      "/LowPriorityMessage_%MessageID%.xml";
}
// Ignore this message.

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)

  1. 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.
  2. 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...

PortConfiguration

Step 8: Strong name and deployment!!

  1. Create a key file using "sn -k Dynamic.snk" in the Visual Studio .NET command prompt.
  2. In the Solution Explorer, right-click on the "DynamicFilePorts" Project Properties, and select "Assembly" and specify the key file name.

    StrongName

  3. In the Solution Explorer, right-click on the "DynamicFilePorts" Project Properties and select "Deploy".
  4. 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.

    BindingProperties

    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.

  1. Please refer to the MSDN documentation on how to create a Send Port and Receive Locations.

Step 10: Test the Solution

  1. 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.
  2. Note that the input file is routed to the destination folder according to the "ID" of the message.

Quick Takeaways

  1. Always set the Activate property to "True" for the first Receive Shape in the orchestration.
  2. Note the use of if-else conditions used directly in the "Expression" shape, instead of using a "Decide" shape.
  3. Content based routing can also be done using filters in Send Ports.
  4. A BizTalk service needs to be re-started every time a deployment is done.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here