For the impatient, here are two config snippets. The first one is the in-the-box “baseConfig” that maps the built-in handlers into a config fragment that can be reused by all configuration files via import:

<?xml version="1.0"?>
<
fabriq xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        
configuration="baseConfig" version="1.0"
        
xmlns="urn:fabriq-europe-microsoft-com:2004-06:fabriq-configuration">
  <handlerType name="fabriqMessageForwarderType" class="Microsoft.Fabriq.Core.FabriqMessageForwarder, Microsoft.Fabriq.Core, Version=1.0.4173.0, Culture=neutral, PublicKeyToken=870ce73bfd71a8eb" />
  <handlerType name="fabriqMessageMapperType" class="Microsoft.Fabriq.Core.FabriqMessageMapper, Microsoft.Fabriq.Core, Version=1.0.4173.0, Culture=neutral, PublicKeyToken=870ce73bfd71a8eb" />
  <handlerType name="fabriqContentRouterType" class="Microsoft.Fabriq.Core.FabriqContentRouter, Microsoft.Fabriq.Core, Version=1.0.4173.0, Culture=neutral, PublicKeyToken=870ce73bfd71a8eb" />
  <handlerType name="fabriqTrackerHandlerType" class="Microsoft.Fabriq.Core.FabriqTrackerHandler, Microsoft.Fabriq.Core, Version=1.0.4173.0, Culture=neutral, PublicKeyToken=870ce73bfd71a8eb" />
  <pipelineType name="fabriqTrackerPipelineType">
     <endpoint/>
     <handler type="fabriqTrackerHandlerType" />
  </pipelineType>
  <pipelineType name="fabriqSimplePipelineType">
     <endpoint/>
     <handler type="fabriqMessageForwarderType" />
  </pipelineType>
  <nodeType name="fabriqTrackerNodeType">
    <actions>
      <action name="anyMessage" match="*">
        <input>
          <message type="xsd:anyType" />
        </input>
        <pipeline type="fabriqTrackerPipelineType" />
      </action>
    </actions>
  </nodeType>
  <nodeType name="fabriqSimpleNodeType">
    <actions>
      <action name="anyMessage" match="*">
        <input>
          <message type="xsd:anyType" />
        </input>
        <pipeline type="fabriqSimplePipelineType" />
      </action>
    </actions>
  </nodeType>
</
fabriq>

This simple configuration file builds on those base definitions for a very simple network with two nodes:

<?xml version="1.0" ?>
<
fabriq xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  configuration="twoSimpleNodes" version="2.15" xmlns="urn:fabriq-europe-microsoft-com:2004-06:fabriq-configuration">
  <import location="baseConfig.xml" />
  <network name="twoSimpleNodes">
    <node host="*" name="FirstNode" type="fabriqSimpleNodeType">
      <ports>
        <wsa:EndpointReference xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing">
          <wsa:Address>msmq://localhost/private$/fabriqport/twoSimpleNodes/FirstNode</wsa:Address>
        </wsa:EndpointReference>
      </ports>
      <output>
        <route to="*">
          <destination priority="1">
            <wsa:EndpointReference xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing">
              <wsa:Address>fabriq://twoSimpleNodes/SecondNode</wsa:Address>
            </wsa:EndpointReference>
          </destination>
        </route>
      </output>
    </node>
    <node host="*" name="SecondNode" type="fabriqSimpleNodeType">
      <ports>
        <wsa:EndpointReference xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing">
          <wsa:Address>msmq://localhost/private$/fabriqport/twoSimpleNodes/SecondNode</wsa:Address>
        </wsa:EndpointReference>
      </ports>
      <output>
        <route to="*">
           <destination priority="1">
               <replyTo/>
          </destination>
        </route>
      </output>
    </node>
  </network>
</
fabriq>


A quick lap around this particular config:

·         Defines two nodes fabriq://twoSimpleNodes/FirstNode and fabriq://twoSimpleNodes/SecondNode

·         Both nodes will be hosted at any host that processes this config (node/@host=‘*’)

·         The primary transport address for both nodes is set to be a private MSMQ queue named “private$/fabriqport” hosted on the local machine (ports section). So this network is really designed to run on just a single box.

·         Both nodes use the “fabriqSimpleNodeType” from the imported “baseConfig” definition. That nodeType accepts any message with any action and runs it through the “fabriqMessageForwarderType” handler (which merely maps wsa:MessageID to wsa:RelatesTo)

·         fabriq://twoSimpleNodes/FirstNode routes any resulting message to fabriq://twoSimpleNodes/SecondNode using a logical URI. That’s then internally mapped to the preferred transport address that fabriq://twoSimpleNodes/SecondNode declares for itself in its <ports> section.

·         fabriq://twoSimpleNodes/SecondNode routes any resulting message to the wsa:ReplyTo destination contained in the original message that was submitted from the outside to fabriq://twoSimpleNodes/FirstNode. The ReplyTo header is carried through the entire network until such a <replyTo> destination is reached. That’s FABRIQ’s concept of getting back to the sender.

Updated: