<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Richard Seroter - SoCal BizTalk Musings</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/richardbpi/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/richardbpi/feed.xml</link>
    <description>Blog featuring tips, code and guidance for BizTalk Server, Commerce Server and Host Integration Server from Microsoft&amp;#039;s former Southern California BizTalk Technology Specialist.  For new postings, check out http://seroter.wordpress.com.</description>
    <lastBuildDate>Wed, 17 Apr 2019 04:02:11 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>I'm Out</title>
      <link>https://docs.microsoft.com/archive/blogs/richardbpi/im-out</link>
      <pubDate>Thu, 11 Jan 2007 17:16:54 GMT</pubDate>
      <dc:creator><![CDATA[Richard Seroter]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/richardbpi/2007/01/11/im-out/</guid>
      <description><![CDATA[Today's my last day here at Microsoft, and as of now, this blog is locked down.&nbsp; But, my...]]></description>
      <content:encoded><![CDATA[<p></p> <p>Today's my last day here at Microsoft, and as of now, this blog is locked down.&nbsp; But, my BizTalk party will continue over at <a href="http://seroter.wordpress.com">http://seroter.wordpress.com</a>.&nbsp; Thanks to all who have contributed, and see you on the other side.</p> <p> <div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:765e2be0-d59d-456e-9362-a473a382785f" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/BizTalk" rel="tag">BizTalk</a></div></p>]]></content:encoded>
    </item>
    <item>
      <title>BizTalk SQL Adapter Debatching and MessageBox Dos and Don'ts</title>
      <link>https://docs.microsoft.com/archive/blogs/richardbpi/biztalk-sql-adapter-debatching-and-messagebox-dos-and-donts</link>
      <pubDate>Thu, 04 Jan 2007 18:35:29 GMT</pubDate>
      <dc:creator><![CDATA[Richard Seroter]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/richardbpi/2007/01/04/biztalk-sql-adapter-debatching-and-messagebox-dos-and-donts/</guid>
      <description><![CDATA[I've posted a few things over to the new blog&nbsp;lately and thought I'd keep this blog in sync...]]></description>
      <content:encoded><![CDATA[<p></p> <p>I've posted a few things over to the <a href="http://seroter.wordpress.com/">new blog</a>&nbsp;lately and thought I'd keep this blog in sync until it shuts down next week. <p>First, I did a <a href="http://seroter.wordpress.com/2007/01/03/debatching-inbound-messages-from-biztalk-sql-adapter/">walkthrough</a> of how do use the out-of-the-box BizTalk XML pipeline to debatch messages coming inbound from the SQL Adapter.&nbsp; Fun stuff. <p>Second, check out the latest post by Lee on the <a href="http://blogs.msdn.com/biztalk_core_engine/default.aspx">BizTalk Core Engine</a>&nbsp;blog which covers some of the underlying SQL magic contained in the MessageBox.&nbsp;&nbsp; He also threatens physical violence against anyone who changes the query plans or stored procs.&nbsp; Ok, not really.&nbsp; Still a good read, even sans violence. <p>Technorati Tags: <a href="http://technorati.com/tag/BizTalk">BizTalk</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Leaving Microsoft ...</title>
      <link>https://docs.microsoft.com/archive/blogs/richardbpi/leaving-microsoft</link>
      <pubDate>Tue, 02 Jan 2007 18:52:21 GMT</pubDate>
      <dc:creator><![CDATA[Richard Seroter]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/richardbpi/2007/01/02/leaving-microsoft/</guid>
      <description><![CDATA[Next Thursday, 1/11/07 will be my last day at Microsoft.&nbsp;&nbsp;I've decided to take an...]]></description>
      <content:encoded><![CDATA[<span style="font-size: 10pt; font-family: arial"> <p>Next Thursday, 1/11/07 will be my last day at Microsoft.&nbsp;&nbsp;I've decided to take an "Architect" position with one of my customers in the Los Angeles area.&nbsp; It was a tough choice to leave my great colleagues and customers, but I'm fairly jazzed about the new opportunities I now have.</p> <p>So, much like <a href="http://en.wikipedia.org/wiki/Han_Solo">Han Solo</a>&nbsp;in <a href="http://www.imdb.com/title/tt0080684/">The Empire Strikes Back</a>, this particular&nbsp;blog will be frozen.&nbsp; Next week it will get locked from any future usage.&nbsp; My new employer has indicated support for my blogging habit, so, I've set up a new blog at <a href="http://seroter.wordpress.com">http://seroter.wordpress.com</a>.&nbsp; I plan on continuing to do the same things on that blog that I do on the current one.&nbsp; So, look out for more code snippets, walkthroughs, demos, reviews, pointers to cool resources and more.&nbsp; I just posted an article on the new <a href="http://seroter.wordpress.com/">BizTalk blog</a> about "<a href="http://seroter.wordpress.com/2007/01/02/orchestration-handling-of-suspended-messages/">considerations for resuming suspended orchestrations</a>".&nbsp; Thrilling stuff.</p> <p>I've really appreciated all the great feedback and questions resulting from the 160+ posts on this blog, and hope you'll continue participating in the new one.</p> <p style="font-size: 10px">Technorati Tags: <a href="http://technorati.com/tag/BizTalk" rel="tag">BizTalk</a> </p></span>]]></content:encoded>
    </item>
    <item>
      <title>Using BizTalk Server For Email Alert Bus</title>
      <link>https://docs.microsoft.com/archive/blogs/richardbpi/using-biztalk-server-for-email-alert-bus</link>
      <pubDate>Thu, 28 Dec 2006 14:15:13 GMT</pubDate>
      <dc:creator><![CDATA[Richard Seroter]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/richardbpi/2006/12/28/using-biztalk-server-for-email-alert-bus/</guid>
      <description><![CDATA[Just recently I had a customer ask me if they could use their existing BizTalk infrastructure to...]]></description>
      <content:encoded><![CDATA[<span style="font-size: 10pt; font-family: arial"> <p>Just recently I had a customer ask me if they could use their existing BizTalk infrastructure to manage events that were spawned from their primary application.&nbsp;&nbsp; So, I built a small demonstration that I've outlined here.</p> <p>Basically, this company's primary application triggers events that should result in email notifications.&nbsp; They wanted something that could listen for these events, send emails, and be flexible and easy to modify.&nbsp; The key is that last part.&nbsp; I wanted to build something that would not require a code change or redeployment if new events were added or email formats had to change.</p> <p>I started with a basic schema.&nbsp; All that I get from the primary application is the "event source" and "event ID".&nbsp; So I need an orchestration that will fetch the additional data needed to send and format the email alert.&nbsp; From the base schema, I created another schema that BizTalk will actually use to send the alert.&nbsp; It looks like this:</p> <p><img src="http://www.seroter.com/blogpics/12.28.2006alert1.jpg"> </p> <p>I've now got a "Template" node which will hold the physical location of the XSLT template, and an "OptionalText" node which will hold any additional text we want to include in the email message (HTML markup supported!).</p> <p>Next I needed a pipeline to do the XSLT conversion.&nbsp; If you recall, the BizTalk SDK ships with a sample for using XSLT to build an HTML formatted email message.&nbsp; I needed to modify that sample because instead of getting the "template" property at design time, I need to use a run-time value.&nbsp; So, I copied the code from the SDK sample, and modified the core <strong>Execute</strong> method:</p> <p style="font-family: courier">public IBaseMessage Execute(IPipelineContext pc, IBaseMessage inmsg)<br>{ <br><span style="color: green">//variable to grab out template location (promoted value)</span><br>string templatePath = inmsg.Context.Read("TemplateLocation", "http://CompanyA.PrimaryApp.EmailNotification.ApplicationAlertPropSchema").ToString();<br><span style="color: green">//call helper method, passing in stream and template path</span><br>inmsg.BodyPart.Data = TransformMessage(inmsg.BodyPart.Data, templatePath); <br>inmsg.BodyPart.ContentType = "text/html"; <br>return inmsg;<br>} </p> <p>&nbsp;Ok, now I had to consume this custom pipeline component.&nbsp; My new "send" pipeline in Visual Studio looks like this:</p> <p><img src="http://www.seroter.com/blogpics/12.28.2006alert2.jpg"> </p> <p>I threw the <strong>XML Assembler</strong> in there just to be sure that my "TemplateLocation" value would get promoted into context.&nbsp; Probably unnecessary, but what the heck.</p> <p>Next we needed the Business Rules that will store the key information needed to construct the email message.&nbsp; Based on the source of the event, we need to designate a recipient, subject, extra "body" information, and template to be used.&nbsp; One of the rules I built looks like this:</p> <p><img src="http://www.seroter.com/blogpics/12.28.2006alert4.jpg"> </p> <p>Note that the <strong>(optional) body text</strong> field contains HTML markup.&nbsp; You may also see that I perform the <strong>Halt</strong> command at the bottom.&nbsp;&nbsp;If that rule fires, then I want to&nbsp;halt&nbsp;further rule execution.&nbsp;I wanted to be able to handle unknown events, so each defined alert had a <strong>Priority</strong> number set in the Business Rules Composer. Finally, I created one final rule with a <strong>Priority</strong> of 0, which by design, will only fire if all preceding rules have been ignored (that is, it's an event that wasn't recognized by any earlier rules and processing halted).&nbsp; That "catch all" rule looks like this:</p> <p><img src="http://www.seroter.com/blogpics/12.28.2006alert5.jpg"> </p> <p>Almost there.&nbsp; Now, an orchestration is needed to tie all this together.&nbsp; My process flow consists of receiving a message, instantiating a .NET class (which holds all the email details), calling my Business Rule(s), building the output message, and sending the message out.&nbsp; The flow looks like this:</p> <p><img src="http://www.seroter.com/blogpics/12.28.2006alert3.jpg"> </p> <p>The main guts of this process exist in the final <strong>Construct </strong>shape.&nbsp; You'll see that the <strong>Construct</strong> shape exists in an <strong>Atomic Scope</strong>.&nbsp; That's because I needed to use a variable of type <strong>XmlElement</strong>.&nbsp; Why?&nbsp; Here's the code for the <strong>Message Assignment</strong>:</p> <p style="font-family: courier"><span style="color: green">Create outbound message from inbound message</span><br>AlertOutput = AlertInput;<br><span style="color: green">Get the XML element holding the optional text</span><br>xmlElem = xpath(AlertOutput, "/*[local-name()='ApplicationAlert' and namespace-uri()='http://CompanyA.PrimaryApp.EmailNotification']/*[local-name()='OptionalText' and namespace-uri()='']");<br><span style="color: green">Set the "innerXML" equal to the HTML markup</span><br>xmlElem.InnerXml = EmailData.EmailBody;<br><span style="color: green">Set the template to use</span><br>AlertOutput.Template = EmailData.EmailTemplate;<br><span style="color: green">Set all the needed email properties</span><br>SendFASTAlertPort(Microsoft.XLANGs.BaseTypes.Address) = "mailto:" + EmailData.EmailTo;<br>AlertOutput(SMTP.From) = EmailData.EmailFrom;<br>AlertOutput(SMTP.Subject) = EmailData.EmailSubject;<br>AlertOutput(SMTP.SMTPHost) = "WS03VSSQL05";<br></p> <p>&nbsp;I had to do the whole "XmlElement" thing because just setting the HTML string equal to the <strong>OptionalText</strong> field caused the HTML markup to get jumbled.&nbsp; By using <strong>InnerXML</strong> on the XMLElement, the HTML (really just valid XML) gets thrown under the <strong>OptionalText</strong> field as XML data, tags intact.&nbsp; Pretty handy.</p> <p>Finally, I built and deployed this whole thing.&nbsp; I then wrote a few XSLT templates to format my HTML email.&nbsp; After feeding a few different alerts into BizTalk, my Outlook mailbox contained the following messages:</p> <p><img src="http://www.seroter.com/blogpics/12.28.2006alert6.jpg"> </p> <p>You'll see the last sentence in each email&nbsp;"body" represents the HTML markup set in the Business Rule.&nbsp; So, now I have an architecture where someone could change just the XSLT template and modify the entire alert message.&nbsp; If you wanted to add new events to be specifically&nbsp;handled, all that's required is a new business rule, and optionally, a new XSLT template.&nbsp; Pretty simple!</p> <p style="font-size: 10px">Technorati Tags: <a href="http://technorati.com/tag/BizTalk" rel="tag">BizTalk</a> </p></span>]]></content:encoded>
    </item>
    <item>
      <title>Versioning Strategy for BizTalk Assemblies</title>
      <link>https://docs.microsoft.com/archive/blogs/richardbpi/versioning-strategy-for-biztalk-assemblies</link>
      <pubDate>Tue, 19 Dec 2006 19:14:51 GMT</pubDate>
      <dc:creator><![CDATA[Richard Seroter]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/richardbpi/2006/12/19/versioning-strategy-for-biztalk-assemblies/</guid>
      <description><![CDATA[I spent a bit of time today reviewing some best practices for assembly version in BizTalk...]]></description>
      <content:encoded><![CDATA[<span style="font-size: 10pt; font-family: arial"> <p>I spent a bit of time today reviewing some best practices for assembly version in BizTalk applications, and wanted to also elicit community feedback.</p> <p>One of the first things that a new BizTalk developer is told when building up a BizTalk solution is to not cram all the various artifacts into a single .NET project.&nbsp; Often that developer will be told to put schemas in one project, maps in another, pipelines in another, and finally orchestrations in an isolated project.&nbsp; I've become less of a fan of this rigid structure.&nbsp; But first, let's see how I'd do an upgrade of a solution configured this way.</p> <p>I'm starting with a simple project, containing a single schema file.&nbsp; The message looks like this:</p> <p><img src="http://www.seroter.com/blogpics/12.19.2006versioning1.jpg"></p> <p>I built and&nbsp;deployed this project and constructed a simple "receive location" and "send port" where the send port had a subscription/filter on <strong>BTS.MessageType</strong>.&nbsp; I tested it, and everything travels through just fine.</p> <p>Then I built a simple orchestration that makes a decision and writes to the event log.&nbsp; It looks like this:</p> <p><img src="http://www.seroter.com/blogpics/12.19.2006versioning2.jpg"></p> <p>I referenced the schema project, built, deployed and tested the orchestration successfully.&nbsp; The next step was to create a new version of the schema.&nbsp; So, I added a "Status" node, and then changed the .NET Assembly Version.</p> <p><img src="http://www.seroter.com/blogpics/12.19.2006versioning3.jpg"> </p> <p>I then rebuilt and deployed the schema project.&nbsp; Now given that you've constantly been told that <strong>namespace#root</strong> has to be unique, the screenshot below may worry you.&nbsp; </p> <p><img src="http://www.seroter.com/blogpics/12.19.2006versioning4.jpg"> </p> <p>If you want to read more about how pipelines resolve schemas, read <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/BTS06CoreDocs/html/35a79a6f-788b-4ca1-8483-36dcba5ae580.asp?frame=true">here</a>.&nbsp; So you may expect&nbsp;that I would&nbsp;get a "ambiguous reference" sort of error when I try and submit the inbound message now.&nbsp; However, when I drop the file, the orchestration still picks it up, processes it and continues on its merry way.&nbsp; But, what happens if I "stop" the orchestration so that I can see the message in flight, and investigate the <strong>SchemaStrongName</strong> property assigned by the pipeline?&nbsp; What you'd see is this:</p> <p>&nbsp;<img src="http://www.seroter.com/blogpics/12.19.2006versioning5.jpg"> </p> <p>Surprise.&nbsp; The schema resolved to the most recent version, and THIS is the one yanked in by the orchestration.&nbsp; This surprised me a bit.&nbsp; I would have expected the send port containing the <strong>BTS.MessageType</strong> filter to yank the most recent version of the schema since it only cared about "type", but I had thought the orchestration would only grab the version it explicitly referenced.&nbsp; Now if I try and remove the "1.0" schema assembly via the Admin Console, I get an error stating that the orchestration is referencing it.</p> <p>So to get rid of the "1.0" schema project, I'd have to reversion the Orchestrations project with an updated build.&nbsp; Then after gracefully transitioning to the new "1.1" orchestration, I could safely remove legacy assemblies.&nbsp; </p> <p>Now, if I used a custom receive pipeline, THEN it seems I can dictate the schema version the orchestration consumes (old schema or new schema).&nbsp; I tested this by putting a receive pipeline (with XML Disassembler and Validator components)&nbsp;in the project with the schema.&nbsp; I deployed that (version 1.0 again).&nbsp; Then, I upped the version to "1.1" and built and deployed.&nbsp; So, now I have schema/pipeline projects for "1.0" and "1.1" and an orchestration project still built with "1.0".</p> <p><img src="http://www.seroter.com/blogpics/12.19.2006versioning6.jpg"> </p> <p>By switching the pipeline, the orchestration would grab specific versions of the schema.&nbsp; For instance, if I dropped a "1.0" message (no "Status" field) when the "1.0" pipeline was selected, everything ran fine.&nbsp; If I dropped a "1.1" message with the "1.0" pipeline still in place, I got a suspended message.&nbsp; Same situation when I flipped to the "1.1" pipeline.&nbsp; The orchestration consumed either the "1.0" OR "1.1" message.</p> <p>So, any conclusions here?&nbsp; Changing .NET Assembly Version has broad impact, regardless of how you've factored your projects.&nbsp; One recommendation I've seen is to only change the <strong>Assembly File Version</strong> so that you still have an incremented build number, but the core .NET version stays the same (allowing for lower impact changes).&nbsp; However, that could get dicey if you are truly introducing breaking changes.&nbsp; You'll also see recommendations to version schemas by changing the <strong>namespace#root</strong> combination (e.g. changing the namespace to <strong>http://Microsoft.Project.BizTalkStuff.v1</strong>).&nbsp; Of course then you HAVE to change all the dependent artifacts (maps, pipelines, orchestrations) because you've made a core modification.</p> <p>This leads me to a solution structure that is less segmented by artifact <strong>type</strong>, but more by artifact <strong>relevance</strong>.&nbsp; That is, group related artifacts in&nbsp;the same&nbsp;project.&nbsp; You still may have a "base schemas" project, but it's also ok to have a subsequent project that contains a few schemas, maps and orchestrations.&nbsp; Try and group the items that will change and version together.&nbsp; Now if I have to version the schema, I can fairly naturally version the sibling artifacts and deploy fewer assemblies.</p> <p><strong>So I ask you</strong>: any other versioning strategies that you prefer when you want to lessen the impact of production modifications?&nbsp; How do you like organizing your solution structure?&nbsp; If you only have to make a slight change, how do you prevent the rebuild of every dependent project?</p> <p style="font-size: 10px">Technorati Tags: <a href="http://technorati.com/tag/BizTalk" rel="tag">BizTalk</a> </p></span>]]></content:encoded>
    </item>
    <item>
      <title>Transactions and Compensation Using BizTalk Server</title>
      <link>https://docs.microsoft.com/archive/blogs/richardbpi/transactions-and-compensation-using-biztalk-server</link>
      <pubDate>Wed, 06 Dec 2006 13:47:00 GMT</pubDate>
      <dc:creator><![CDATA[Richard Seroter]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/richardbpi/2006/12/06/transactions-and-compensation-using-biztalk-server/</guid>
      <description><![CDATA[After reading Charles Young's fantastic post today on BizTalk transaction compensation, I was...]]></description>
      <content:encoded><![CDATA[<SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: arial">
<P>After reading <A href="http://geekswithblogs.net/cyoung/" mce_href="http://geekswithblogs.net/cyoung/">Charles Young's</A> fantastic post today on <A href="http://geekswithblogs.net/cyoung/articles/100424.aspx" mce_href="http://geekswithblogs.net/cyoung/articles/100424.aspx">BizTalk transaction compensation</A>, I was finally inspired to write a post that's been on my blog "to do" list for 7 months.&nbsp; Specifically, I wanted to demonstrate simple compensation handling, and dealing with loops and transactions.</P>
<P>&nbsp;I'd like to walk through a simple solution I just built and demonstrate the transactional considerations.&nbsp; The first thing to show here is that data (variables, messages) manipulated within an atomic scope do NOT have their changes committed unless the atomic scope successfully completes.&nbsp; In the picture below, you'll see a very simple orchestration I built that receives a message, sets a value for a variable ("Status"), jumps into an atomic transaction, does a calculation, updates the "Status", and finally completes by writing the "Status" value back out.&nbsp; Basically what I'm trying to show is that the variable "Status" may have gotten changed by the action in the atomic scope, however, if the scope fails for any reason, that change isn't committed.</P>
<P><IMG src="http://www.seroter.com/BlogPics/12.06.2006tranx1.jpg" mce_src="http://www.seroter.com/BlogPics/12.06.2006tranx1.jpg"> </P>
<P>I'm using the (now-Microsoft) tool <A href="http://www.microsoft.com/technet/sysinternals/Miscellaneous/DebugView.mspx" mce_href="http://www.microsoft.com/technet/sysinternals/Miscellaneous/DebugView.mspx">DebugView</A> to view the <STRONG>Debug.WriteLine</STRONG> statements embedded in my orchestration.&nbsp; When I pass in a simple message, you see here that indeed the value is initialized ("Starting") and changed by the atomic transaction ("Updated").</P>
<P><IMG src="http://www.seroter.com/BlogPics/12.06.2006tranx2.jpg" mce_src="http://www.seroter.com/BlogPics/12.06.2006tranx2.jpg"></P>
<P>If I pass in a bad message (in this case, dividing by 0), then the orchestration is suspended and the compensation code does NOT fire.&nbsp; Why?&nbsp; Compensation only fires for committed transactions, and since an operation within the atomic scope failed, there's technically nothing committed, so nothing needs to be compensated.&nbsp; Now what if I wrap the atomic transaction in an <STRONG>long running </STRONG>(LR) transaction so that I can catch any exceptions and gracefully handle it?</P>
<P><IMG src="http://www.seroter.com/BlogPics/12.06.2006tranx3.jpg" mce_src="http://www.seroter.com/BlogPics/12.06.2006tranx3.jpg"></P>
<P>Now, when I run this process, the exception block catches the error, and I continue on in my orchestration.&nbsp; As you'll see here, because the atomic transaction did not commit, the "Status" field change was not persisted.</P>
<P><IMG src="http://www.seroter.com/BlogPics/12.06.2006tranx4.jpg" mce_src="http://www.seroter.com/BlogPics/12.06.2006tranx4.jpg"></P>
<P>What happens if we instead cause an exception AFTER the atomic transaction has completed?</P>
<P><IMG src="http://www.seroter.com/BlogPics/12.06.2006tranx5.jpg" mce_src="http://www.seroter.com/BlogPics/12.06.2006tranx5.jpg"></P>
<P>You'll see here that the step following the atomic transaction raises an exception.&nbsp; What do you expect to happen when I drop a standard (valid) message into this orchestration?</P>
<P><IMG src="http://www.seroter.com/BlogPics/12.06.2006tranx6.jpg" mce_src="http://www.seroter.com/BlogPics/12.06.2006tranx6.jpg"></P>
<P>The compensation code did NOT fire since I didn't do anything to trigger it.&nbsp; All that happened was that the shapes in the Exception block were processed.&nbsp; Let's force a compensation to happen.&nbsp; We could, in the Exception block, use a <STRONG>Compensation</STRONG> shape and explicitly compensate the atomic transaction.&nbsp; But, what if I had 4 atomic transactions in there and didn't want to explicitly roll back each?&nbsp; What I can do is compensate the <STRONG>Long Running</STRONG> transaction, which in turn will execute the compensation code for each contained transaction in reverse order.&nbsp; We'll see more of that in a second.&nbsp; My compensation now looks like this:</P>
<P><IMG src="http://www.seroter.com/BlogPics/12.06.2006tranx7.jpg" mce_src="http://www.seroter.com/BlogPics/12.06.2006tranx7.jpg"></P>
<P>If I spin up the orchestration now, you can see here that the Exception block AND compensation code both fire.&nbsp; Sweet.</P>
<P><IMG src="http://www.seroter.com/BlogPics/12.06.2006tranx8.jpg" mce_src="http://www.seroter.com/BlogPics/12.06.2006tranx8.jpg"></P>
<P>What happens if I add a second atomic scope to our LR transaction and raise the exception after the new transaction?</P>
<P><IMG src="http://www.seroter.com/BlogPics/12.06.2006tranx9.jpg" mce_src="http://www.seroter.com/BlogPics/12.06.2006tranx9.jpg"></P>
<P>Without changing anything in the LR transaction, it went ahead and executed compensation on both transactions in reverse order.</P>
<P><IMG src="http://www.seroter.com/BlogPics/12.06.2006tranx10.jpg" mce_src="http://www.seroter.com/BlogPics/12.06.2006tranx10.jpg"></P>
<P>The last thing I want to show here (and probably the neatest), is something Charles mentioned in passing in his article.&nbsp; I like to show this when I teach BizTalk workshops and it always amuses folks. What happens if I'm executing transaction in the confines of a loop?&nbsp; Is BizTalk actually smart enough to keep track of this and handle it appropriately?&nbsp; I've modified my orchestration to now contain a Loop shape and cycle through 5 times.&nbsp; On each pass, it executes the atomic transaction.&nbsp; Following the loop, I raise an exception.&nbsp; I still haven't changed anything with regards to compensation in the LR transaction.</P>
<P><IMG src="http://www.seroter.com/BlogPics/12.06.2006tranx11.jpg" mce_src="http://www.seroter.com/BlogPics/12.06.2006tranx11.jpg"></P>
<P>Any idea what you'll see when I run this?&nbsp; As you'll notice below, it goes ahead and executes each transaction, and exception is thrown and caught, and each of the looped transactions have their respective compensation code called.&nbsp; Neato.&nbsp; I'm always impressed to see that.</P>
<P><IMG src="http://www.seroter.com/BlogPics/12.06.2006tranx12.jpg" mce_src="http://www.seroter.com/BlogPics/12.06.2006tranx12.jpg"></P>
<P>There you go.&nbsp; Read Charles' article for significant more depth on the topic, but hopefully this provides a more simple take on a fairly complex process.</P>
<P style="FONT-SIZE: 10px">Technorati Tags: <A href="http://technorati.com/tag/BizTalk" rel=tag mce_href="http://technorati.com/tag/BizTalk">BizTalk</A> </P></SPAN>]]></content:encoded>
    </item>
    <item>
      <title>Choosing the Right Integration Technology</title>
      <link>https://docs.microsoft.com/archive/blogs/richardbpi/choosing-the-right-integration-technology</link>
      <pubDate>Wed, 29 Nov 2006 14:28:42 GMT</pubDate>
      <dc:creator><![CDATA[Richard Seroter]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/richardbpi/2006/11/29/choosing-the-right-integration-technology/</guid>
      <description><![CDATA[Yesterday Irena Kennedy posted a great compilation of multiple sources&nbsp;which resulted in a big...]]></description>
      <content:encoded><![CDATA[<p>Yesterday <a href="http://blogs.msdn.com/irenak/default.aspx">Irena Kennedy</a> posted a <a href="http://blogs.msdn.com/irenak/archive/2006/11/29/sysk-249-choosing-the-right-microsoft-integration-technology.aspx">great compilation of multiple sources</a>&nbsp;which resulted in a big fat post&nbsp;outlining selection criteria for an integration solution.&nbsp; She&nbsp;summarizes&nbsp;choosing between SSIS, MSMQ, WCF, BizTalk, SQL Service Broker, and Host Integration Server.&nbsp;&nbsp;&nbsp;Check it out.</p> <p>Also, if you've never undergone a code review by Irena, you haven't truly lived.&nbsp; It's a truly terrifying and rewarding experience from a brilliant MCS asset.</p>]]></content:encoded>
    </item>
    <item>
      <title>Installing BizTalk Server 2006 R2 Beta 1</title>
      <link>https://docs.microsoft.com/archive/blogs/richardbpi/installing-biztalk-server-2006-r2-beta-1</link>
      <pubDate>Tue, 28 Nov 2006 12:23:00 GMT</pubDate>
      <dc:creator><![CDATA[Richard Seroter]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/richardbpi/2006/11/28/installing-biztalk-server-2006-r2-beta-1/</guid>
      <description><![CDATA[Yesterday I did a quick evaluation of the Beta 1 release of BizTalk Server 2006 R2, and thought...]]></description>
      <content:encoded><![CDATA[<SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: arial">
<P>Yesterday I did a quick evaluation of the Beta 1 release of BizTalk Server 2006 R2, and thought I'd walk through the installation process and highlight some new things I noticed. </P>
<P>The Beta 1 release looks to be for early adopters only, so there is no "public" release at the moment. Hopefully there will be one in the Spring. Also please note that anything shown here is subject to change by Beta 2 or final release. </P>
<P>First, I walked through the standard installation.<BR><BR><IMG src="http://www.seroter.com/blogpics/11.28.2006R2install1.jpg" mce_src="http://www.seroter.com/blogpics/11.28.2006R2install1.jpg"> 
<P>Next I chose the components to install. You can see from my image below that there are additional EDI/AS2 components, Windows Communication Foundation (WCF) bits, and additional BAM Eventing (new interceptors for both Windows Workflow and WCF). <IMG src="http://www.seroter.com/blogpics/11.28.2006R2install2.gif" mce_src="http://www.seroter.com/blogpics/11.28.2006R2install2.gif"> </P>
<P>After installing, I jumped right to configuration. As you can see here, not a whole lot of changes.<BR><BR><IMG src="http://www.seroter.com/blogpics/11.28.2006R2install3.jpg" mce_src="http://www.seroter.com/blogpics/11.28.2006R2install3.jpg"> </P>
<P>You will see additional configuration, however, for the new EDI/AS2 functionality.<BR><BR><IMG src="http://www.seroter.com/blogpics/11.28.2006R2install4.jpg" mce_src="http://www.seroter.com/blogpics/11.28.2006R2install4.jpg"> </P>
<P>Next I went through and installed the new BizTalk .NET adapters. These adapters allow you to ping various Line of Business (LOB) systems directly through .NET code without going through BizTalk.<BR><BR><IMG src="http://www.seroter.com/blogpics/11.28.2006R2install5.jpg" mce_src="http://www.seroter.com/blogpics/11.28.2006R2install5.jpg"><BR><IMG src="http://www.seroter.com/blogpics/11.28.2006R2install6.jpg" mce_src="http://www.seroter.com/blogpics/11.28.2006R2install6.jpg"> </P>
<P>Once everything was installed, I went to see if anything new showed up in the BizTalk Administration Console. First thing I saw was a new "Application" called <B>BizTalk EDI Application</B>. Inside, there were a couple of orchestrations, lots of schemas, ad a few pipelines.<BR><BR><IMG src="http://www.seroter.com/blogpics/11.28.2006R2install7.jpg" mce_src="http://www.seroter.com/blogpics/11.28.2006R2install7.jpg"> </P>
<P>Next I checked out the "Adapters" section and saw all the new WCF adapters available. Nice.<BR><BR><IMG src="http://www.seroter.com/blogpics/11.28.2006R2install8.jpg" mce_src="http://www.seroter.com/blogpics/11.28.2006R2install8.jpg"> </P>
<P>I read in one of the documents that the BAM Management tool had been upgraded, so I looked at the <B>bm.exe</B> command line tool to see what new options were available. You'll see below that there are now options to deal directly with interceptors. This will allow you to instrument your WF and WCF process to feed data directly into the common BAM infrastructure. I like it.<BR><BR><IMG src="http://www.seroter.com/blogpics/11.28.2006R2install9.jpg" mce_src="http://www.seroter.com/blogpics/11.28.2006R2install9.jpg"> </P>
<P>I wanted to see all the options available for the WCF adapters, so I went ahead and build a couple new receive locations. The first receive location uses the <B>WCF - WSHttp</B> adapter.<BR><BR><IMG src="http://www.seroter.com/blogpics/11.28.2006R2install10.gif" mce_src="http://www.seroter.com/blogpics/11.28.2006R2install10.gif"> </P>
<P>Then I built a <B>WCF - Custom</B> location. Check out all the various options below:<BR><BR><IMG src="http://www.seroter.com/blogpics/11.28.2006R2install11.gif" mce_src="http://www.seroter.com/blogpics/11.28.2006R2install11.gif"> </P>
<P>Finally, I jumped into Visual Studio.NET 2005 and kicked off the <B>WCF Service Publishing Wizard</B>. If you've ever used the standard <B>Web Services Publishing Wizard</B>, then you'd be fairly familiar with this one.<BR><BR><IMG src="http://www.seroter.com/blogpics/11.28.2006R2install11.jpg" mce_src="http://www.seroter.com/blogpics/11.28.2006R2install11.jpg"><BR><IMG src="http://www.seroter.com/blogpics/11.28.2006R2install12.jpg" mce_src="http://www.seroter.com/blogpics/11.28.2006R2install12.jpg"> </P>
<P>In future posts I'll dig more into how to actually use all these great new functions. Some folks are already digging into the functionality, like my buddy <A href="http://weblogs.asp.net/gsusx/default.aspx" mce_href="http://weblogs.asp.net/gsusx/default.aspx">Jesus Rodriguez</A> who has a post on <A href="http://weblogs.asp.net/gsusx/archive/2006/11/21/invoking-tcp-hosted-wcf-services-using-biztalk-server-r2.aspx" mce_href="http://weblogs.asp.net/gsusx/archive/2006/11/21/invoking-tcp-hosted-wcf-services-using-biztalk-server-r2.aspx">Invoking TCP-Hosted WCF Services using BizTalk Server R2</A>. </P>
<P style="FONT-SIZE: 10px">Technorati Tags: <A href="http://technorati.com/tag/BizTalk" rel=tag mce_href="http://technorati.com/tag/BizTalk">BizTalk</A> </P></SPAN>]]></content:encoded>
    </item>
    <item>
      <title>MSDN Magazine Article on Custom BizTalk Adapters</title>
      <link>https://docs.microsoft.com/archive/blogs/richardbpi/msdn-magazine-article-on-custom-biztalk-adapters</link>
      <pubDate>Fri, 17 Nov 2006 19:07:00 GMT</pubDate>
      <dc:creator><![CDATA[Richard Seroter]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/richardbpi/2006/11/17/msdn-magazine-article-on-custom-biztalk-adapters/</guid>
      <description><![CDATA[Good article in this month's MSDN Magazine called Integrate E-Mail Processing Into Your Business...]]></description>
      <content:encoded><![CDATA[<SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: arial">
<P>Good article in this month's MSDN Magazine called <A href="http://msdn.microsoft.com/msdnmag/issues/06/12/BizTalkAdapters/default.aspx" mce_href="" http: msdn.microsoft.com msdnmag issues 06 12 BizTalkAdapters default.aspx?>Integrate E-Mail Processing Into Your Business Solutions</A>. It covers a variety of topics, including the POP3 adapter, orchestration and some BizTalk plumbing. I also found the part on writing a custom adapter to deal with email message attachment parts fairly interesting. The custom adapter takes each message part and adds it to a custom database. Check it out. </P>
<P style="FONT-SIZE: 10px">Technorati Tags: <A href="http://technorati.com/tag/BizTalk" rel=tag mce_href="http://technorati.com/tag/BizTalk">BizTalk</A> </P></SPAN>]]></content:encoded>
    </item>
    <item>
      <title>BizTalk Property Schemas Separated From Associated Schemas</title>
      <link>https://docs.microsoft.com/archive/blogs/richardbpi/biztalk-property-schemas-separated-from-associated-schemas</link>
      <pubDate>Fri, 17 Nov 2006 17:59:00 GMT</pubDate>
      <dc:creator><![CDATA[Richard Seroter]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/richardbpi/2006/11/17/biztalk-property-schemas-separated-from-associated-schemas/</guid>
      <description><![CDATA[I caught a glimpse of something in the BizTalk Server 2006 Help the other day that surprised me a...]]></description>
      <content:encoded><![CDATA[<SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: arial">
<P>I caught a glimpse of something in the BizTalk Server 2006 Help the other day that surprised me a bit. The note said:<BR><I>If a property schema is associated with a message schema, then these two must be in the same BizTalk project. Separating property schema from its associated message schema in different BizTalk projects is not supported.</I> <BR>I had seen that mentioned elsewhere and had mentally discarded it, but I wanted to see whether it's not <B>possible</B>, or it's not <B>supported</B>. </P>
<P>First step was to build two separate projects; one to hold my property schema, another to hold my working schemas. <BR><BR><IMG src="http://www.seroter.com/BlogPics/11.17.2006promotedassembly1.jpg" mce_src="http://www.seroter.com/BlogPics/11.17.2006promotedassembly1.jpg"> <BR>The property schema has a single field, <B>OrderID</B>. After building and compiling the project, I referenced that project from my primary schemas project. I then tried to promote the <B>OrderNumber</B> value in the schema, and sure enough, I was allowed to pick a schema from a referenced assembly. So far so good. <BR><BR><IMG src="http://www.seroter.com/BlogPics/11.17.2006promotedassembly2.jpg" mce_src="http://www.seroter.com/BlogPics/11.17.2006promotedassembly2.jpg"> <BR></P>
<P>After also promoting the value in my second schema, I deployed all the projects. Next step was to build a send port that had a subscription filter in the <B>OrderID</B> property field. Finally, I dropped two different messages into BizTalk (via FILE receive location), and both messages were picked up by the send port.<BR><BR><IMG src="http://www.seroter.com/BlogPics/11.17.2006promotedassembly3.jpg" mce_src="http://www.seroter.com/BlogPics/11.17.2006promotedassembly3.jpg"> <BR></P>
<P>So, from a technical standpoint, this seems to work fine. Clearly there's some reason for us making this an unsupported configuration, and I'm all ears as for why that's the case. It would seem to me that separating my property schemas into a separate assembly creates a much more flexible architecture than forcing it to live with the schemas that use it. Thoughts? </P>
<P>BTW, I'm jazzed that this is my first post using Microsoft Windows Vista RTM, Office 2007 RTM, and Expression Web Designer (to write the post itself). After installing Windows Vista, I finally had to discard my trusty Allaire Homesite which wouldn't install correctly. I've used Homesite (now owned by Macromedia) for years to write all my HTML, but finally have to upgrade my toolset. Of course, I'll still do the HTML by hand, but now in a snazzier shell. </P>
<P style="FONT-SIZE: 10px">Technorati Tags: <A href="http://technorati.com/tag/BizTalk" rel=tag mce_href="http://technorati.com/tag/BizTalk">BizTalk</A> </P></SPAN>]]></content:encoded>
    </item>
  </channel>
</rss>