I’ve just uploaded an
updated version of my PipelineTesting library
for BizTalk Server 2006. This version fixes an issue that Gregory
Van de Wiele
pointed to me a couple of weeks ago. Thanks Gregory!

The issue was that when I added Transaction support to the pipeline library, I didn’t
provide a way to control the transaction lifetime, or worse, the transaction end result.
What ended up happening was that if you called EnableTransactions() on the pipeline,
the transaction was created on demand when one component in the pipeline called IPipelineContextEx.GetTransaction().
However, nowhere did I explicitly release the transaction nor called Commit()
or Rollback() on it causing fairly ugly issues because the transaction release
was left to the GC.

Fixing this issue did imply I had to make a breaking change in the API, but hopefully
not one too bad. I changed the EnableTransactions() method in the pipeline classes
to return a TransactionControl object that you could use to control transaction lifetime
and result. Basically, this one works pretty much like the TransactionScope class
in System.Transactions: You wrap it in a using() declaration and if you want to commit,
you cal SetComplete() on it just before disposing it. Here’s an example of using the
pipeline with the transaction support enabled:

[Test]

public void CanCreateTransaction()

{

   SendPipelineWrapper pipeline =

      PipelineFactory.CreateSendPipeline(typeof(XMLTransmit));

   using ( TransactionControl control = pipeline.EnableTransactions() )

   {

      // Create the input message to pass through the pipeline

      Stream stream = DocLoader.LoadStream(“SampleDocument.xml”);

      IBaseMessage inputMessage = MessageHelper.CreateFromStream(stream);

      // Add the necessary schemas to the pipeline, so that

      // disassembling works

      pipeline.AddDocSpec(typeof(Schema1_NPP));

      pipeline.AddDocSpec(typeof(Schema2_WPP));

      MessageCollection inputMessages = new MessageCollection();

      inputMessages.Add(inputMessage);

      // Execute the pipeline, and check the output

      IBaseMessage outputMessage = pipeline.Execute(inputMessages);

      Assert.IsNotNull(outputMessage);

      control.SetComplete();

   }

}

Enjoy.

Technorati
tags: BizTalk
Server
, BTS, Unit
Testing