Orchestration variable retriever functoid (and why you should not use it)

This week I spend some time on writing a functoid that retrieves the value of a variable in an orchestration. Lets take a look on the functoid’s usage first.

Usage

This is the declaration of a string variable ‘lastName’ in a very simple test orchestration:

image

This is the expression shape where the value of that variable is set to my last name:

image

This is the map that is executed using a transform shape right after the expression shape above. The map contains the variable retriever functoid. It has one parameter that takes the name of the variable to fetch.

Please pay special attention to the icon because that bloody thing took me 50% of the development time. The result shows why I try to stay away from UI development as much as possible. :-)

image

Finally this is the Xml message returned from the orchestration via the file adapter.

image

Disadvantages

At first I was a little excited that I got this working. I did some testing with different orchestrations and it seems to work OK. After a while (and thinking this over) my excitement was tempered because I think the functoid has three big disadvantages:

  1. Although questions related to this popup regularly in the BizTalk newsgroups I could not think of any real world examples. The sample above could also be implemented by using a message assignment shape after the map. In the message assignment shape the value of the variable can be assigned using xpath, properties or distinguished fields. The only way the functoid can be useful is when you need an orchestration variable value in a map to do some processing while the actual value is not mapped to the destination schema. But then again there are other ways to implement that. (Using a helper message and a multi message map). 
  2.  The functoid code contains a considerable amount of reflection code. I didn’t do any performance tests but it is obvious that reflection comes with a cost. So in terms of performance it will probably be much better  to use alternative methods.
  3.  This is probably not supported by MS. Mainly because it uses XLANG code which is normally hidden from the developers. 

These disadvantages make me conclude that this functoid is not very useful in real world scenarios. I really want to know what others think about this. So whether you agree or don’t agree please share your thoughts on this!

The other way around

Now that I figured out a way to access a variable it is a small step to take this a little further and build a functoid that WRITES the value of a variable in an orchestration. I didn’t implement such a functoid because of above mentioned points. I also think writing, as opposed to, reading is very tricky because you need to take things like serialization and locking into account.

If your still not convinced that you should not use this you can download the functoid “dll” from here.

Installation instructions:

  • copy the .dll to the ‘Mapper Extensions’ folder which resides in the BizTalk installation folder.
  • put the .dll in the gac.
  • Open a map in Visual Studio, click right in the toolbox area and choose the functoids tab.
  • Browse the the functoid dll in the ‘Mapper Extensions’ folder to add it to the toolbox.

The source is also available here. It is build using BizTalk 2006 R2.

Advertisement

6 Responses to Orchestration variable retriever functoid (and why you should not use it)

  1. Vineet says:

    I think this is a great post. It atleast gives us an option between multiple message map or accessing orchestration variable.

  2. Helder says:

    Hi,

    this is great! Thks, i need this to change a value in a several nodes, all with the same name in diferent records, and xpah is not the way…

    Performance is not very important in my case.

    Many thks ;)

  3. Anonymous says:

    I re-compiler it and put it in Biztalk2009.
    But, It is not work.
    Is the functoid not work in Biztalk2009?

    Thanks your help.
    Peter

  4. Peter says:

    I re-compiler it and put it in Biztalk2009.
    But, It is not work.
    Is the functoid not work in Biztalk2009?

    Thanks your help.
    Peter

  5. Anonymous says:

    You can modify the source schema then use it in maps.

  6. wos says:

    Hello,

    FYI: I changed the Functoid’s ConnectionType and Category due to connect it to a scripting functoid.

    this.Category = FunctoidCategory.String;
    this.OutputConnectionType = ConnectionType.All;
    AddInputConnectionType(ConnectionType.All);

    Otherwise it doen’t work (I’m using BTS 2009).

    Furthermore I experienced problems when trying to read an orchestration variable that is not used within an orchestration scope.
    When I assign a value to the variable in an expression shape on top level (no orchestration scope), the Functoid always returned null because in the Functoids RetrieveVariableFromField – method a NullObjectReference – Exception is thrown when trying to retrieve the value (fieldInfo.GetValue(xLangContext) is null).
    Seems like the variables value is not persisted somehow.

    A dummy usage (e.g. writing the variables value to the event log) in a sub-scope solved the issue.

    So long,

    wos

Leave a Reply

Fill in your details below or click an icon to log in:

Gravatar
WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.