I took the BizTalk 2004 exam today and passed. I thought it was pretty hard, but the questions were fair, and a good test of your hands-on experience and understanding of the product. It would be hard to just cram for the exam from documents, if you don’t know the product, you won’t do too well. It has a reputation for not being an easy exam, so that’s more credit to anyone who passes.
Some resources I found helpful:
BizTalk Server 2004 Unleashed
Good info in the more detailed sections, and helpful for the admin, and management stuff.
Read the more advanced stuff (and make sure you have the latest update!)
Run through these, deploy them, and get an understanding of how the code works.
Deep Dive Course
If you have a chance to get on the course, go for it, it’s a great help for the exam. If you have taken the course and understand the content you have a good chance, re-read the slides on the stuff you are unsure of.
There’s a good section of whitepapers appearing on MSDN, they are worth checking out.
Last week I installed the BizTalk 2006 CTP bits obtained from Tech-Ed a couple of times on a VPC. I learned a couple of things during the install that others have also blogged on, but that are good things to keep in mind: 1. Follow Microsoft’s installation instructions to the letter. There are quite a few components that must be installed and in order. You can find the instructions here on Microsoft’s site. 2. BizTalk 2006 CTP runs on SQL 2000 sp3a, while the BizTalk 2006 Beta bits should run on SQL 2005. When you install Visual Studio 2005 Beta II, you must deselect the install for SQL 2005 Express. Scott Woodgate has more information on his blog about why the CTP bits run on SQL 2000. 3. When the BizTalk Configuration Wizard executed, I ran into the following screen with a warning about the BAM Portal when I chose the default configuration option. I was able to clear the error by going back and choosing a custom install. BizTalk Configuration Wizard – BAM Portal Error 4. For some reason the Notification services for the BAM alerts registers an error entry in the event viewer when I restart the VPC. I’m able to restart the service after the image has booted, but I’d like to see if I can stop the error from happening. I’d like to hear if others have also experienced this issue. If you have any comments or advice, feel free post. Thanks. -Brennan…
Tech-Ed 2005 took place a couple of weeks ago and I’m now finding time to post some updates. Both Brandon and I staffed the Microsoft CSI booth and presented on Implementing Real-World Integration Patterns with BizTalk. For more information on the session we presented, CSIC14 (Cabana Talk) Implementing Real-World Integration Patterns with BizTalk, please take a look at the Tech-Ed website. Our goal of the session was to take something more or less theoretical (ie patterns) and put some criteria around the patterns to determine whether application of that pattern made sense to a given business scenario. We spent the first half of our session presenting on common integration patterns that Brandon had developed for Microsoft. We also presented on the importance of patterns and contributing back to the integration community. The patterns developed are only going to grow through input from people implementing the patterns. If you’re interested in contributing to the integration patterns, feel free to look at the BEP workspace on gotdotnet. In the last half of the session we divided the group into two teams and gave each team a similiar business scenario with slightly different requirements. Based on the requirements we worked with each group and discussed which criteria to use when determining how to implement one or more integration pattern. If you weren’t able to make it to Tech-Ed or to our session you will still be able to grab our presentation, sample business scenarios, and the Pattern decision tree used to help determine if an integration pattern makes sense for the given scenario. I’ll make sure to post the information before the end of this week. I’d love any comments people might have about our presentation or materials….
I’ll be working on the “Ask the Experts” stand for BizTalk Server at TechEd in Amsterdam next week, along with other MVPs and Microsoft staff. Feel free to drop in if you have any BizTalk related questions. There’s a lot of BizTalk 2006 presentations that I want to catch, I got an early build of 2006 a couple of weeks ago, and I’d be keen to see a run-through of the new features. The new admin console is great, and the setup and config is a lot easier (have not tried a multi-box install yet though…), and working in Visual Studio 2005 is very sweet.
If any “Bloggers Guide” contributors can catch me anywhere near a bar next week, you are welcome to a free beer (or drink if you are wise enough not to indulge). It would be great to say “Cheers” for all the contributions, and keeping the guide alive. (That’s not an offer I could afford to make in Stockholm J).
Abstract: I’ve using BAM to measure execution time in some orchestrations. I cannot use HAT because I needed to do some calculations to rest waiting time of the external processes. It’s extremely easy. Things get funny when we needed to get more that one row per orchestration instance (because of loops which are there)
Today I’ve doing this BAM at a customer’s. I’m going back home in a high velocity train, but it’s a long trip, so I think this post is going to get long I’ll divide it in 2 parts:
Part 1- The easy sample
The scenario is quite simple: some orchestrations provide a synchronous web service fa%u00e7ade for a legacy system. The logic for integration with lecagy includes files interchange, sockets comminications and some transformations from/to Xml and HL7 flat files.
What we want: stress the solution and get detailed information about orchestration execution time. This execution measured time should not include web service communications or file interchange with the legacy system, because the intention is to measure BizTalk performance, regardless of network bandwidth or external dependencies.
Here is the sample:
In the simplified sample (actual processes are a little more complex :-), we must measure time between start (Receive 1) and Send 1, and time between Receive 2 and last send back (Send 2). Time between Send 1 and Receive 2 must be taken away.
All this information is in tracking database, and can be queried at a basic level with HAT. Probably it’s not very complex to query the tracking database to get these values. Since each shape has a start and end time, it’s just a question of making the right queries.
Anyways, as I have only one working day to prepare the environment for the tests, I don’t have time to study the tracking DB internals. I’ve done the easy way: BAM milestones. It’s easy because there’s no need to know about BizTalk internals (tracking db design) and flexible because BAM definitions can be designed and deployed independently to the orchestration development.
So, I’ll show how to do it in just 10 minutes (for the above sample):
1- Create BAM definition with the BAM Structures Mega Designer (aka the little Excel sheet :-). These definitions include 4 Activity Items, all of them as milestones. I’ll not use duration view items to catch intervals, instead I’ll do a Transact/SQL DATEDIFF later.
Time estimated: 3 minutes
2- Export the BAM definition to an Xml file, and deploy it in the server with BAM Management Utility (bm.exe).
Use the Tracking Profile Editor to assign each activity item to orchestration shapes.
Don’t forget to assign an Activity Id, tipically an Id field takes from the message schema.
Deploy the profiles to the server.
Time estimated: 3 minutes
3- Only have 4 minutes left, so I’ll assume there is some test automation :-).
Launch the tests (with NUnit in my case).
Open SQL Server Query Analyzer, connect to the DB server, switch to the BAMPrimaryImport database and open the corresponding BAM view. There you can see the milestones catched.
Now you can calculate execution times with basic date adds and rests. It you want to do it with SQL DATEDIFFs, execute something like this:
DATEDIFF(ms, [Milestone1], [Milestone2]) As Segment1,
DATEDIFF(ms, [Milestone3], [Milestone4]) As Segment2,
(Segment1+Segment2) As TotalTime
Time estimated: 5 minutes (ouch, 1 minute late!)
well, actually the last part is not true you cannot use Segment1 and Segment2 aliases in the last line, so you’ll need to repeat the DATEDIFF statements. I’ve included in this way to improve readability.
Also, another nice way to do it is query the standard views with Excel and play with columns and formulas.
Now we are ready to launch stress tests and query orchestration execution times easily. The stress tests will be launched via Application Center Test, so we can control concurrent users, test timing, etc.
Part 2- I have a Loop and BAM Activity items cannot be assigned
The second orchestration has been more tricky. It’s a 1-to-many fa%u00e7ade, so it has a loop to send many messages to the legacy systems. Something like:
The problem: Activity items cannot be assigned to shapes inside the loop. Why? because each activity item is a row, and the Activity Id is taken from a message field that is unique for the orchestration.
The solution: use the API to add new BAM rows for each loop iteration. The Activity Id of each child-row will be the parent Activity Id plus the counter of the loop, so they can be related easily in a query.
The BAM API is very straightforward. One object, three methods: The EventStream object is used to create a new activity (BeginActivity method), update rows (UpdateActivity) of close the activity (EndActivity).
You can use a DirectEventStream object that writes the data in the BAMPrimaryImport database directly. This can impact the performance because it’s synchronous.
You can either use the BufferedEventStream object that use a asynchronous store-and-forward. It does not guarantee that the event will be inserted in BAM immediately, but it does not affect caller performance.
Here is the tricky thing: There is a property called ConnectionString that points to the database. If you use the DirectEventStream, ConnectionString points to BAMPrimaryImport database. But if you use BufferedEventStream, its ConnectionString points to the MessageBox database, because it’s used for store-and-forward.
My code between the orchestration and a helper component does more or less the following:
For each loop iteration:
– Begin an new Activity, using [ActivityId].[LoopCounter]
– Update with a milestone before sending to legacy
– Update with a milestone after receiving from legacy
– Close the Activity
The query to aggregate everything (courtesy of eXtreme.net, because I don’t have quick Transact/SQL skills), return a single row with the calculated fields for TotalTime and TotalTimeWithoutLegacyStuff. It uses DATEDIFF for the differences, and SUBSTRING to relate different parent and child Activity IDs
So, for each orchestration instance, I have in the BAM database:
– One row with
– Orchestration Activity Id
– Milestones for BeginOrch and EndOrch
– Many “child” rows (the loop) with
– Orchestration Activity Id + Counter
– Milestones for BeginSend and EndReceive
What are Promoted Properties and why does BizTalk have them?
Long and short of it: Property promotion is about getting easy and fast access to data.
Easy: Because you typically do not have to know anything about your data to get access to it. Example: Message(some property). Rather then some long and error prone xpath query.
Fast: Because you do not have to load the whole message into memory to get access to the data. It is placed inside the message context (a collection of key-value pairs that are associated with a message).
BizTalk provides two different types of promoted properties based on what you want to do with the data. The two types are Promoted Properties and Distinguished Fields.
Distinguished Fields are light weight and only accessible inside an Orchestration. They could be used inside a decision shape or for extracting data out of a message for dynamic routing. They are read/write so it provides an easy way to change values inside your message without using a map – such as updating a status field.
Promoted Properties are system wide but could also be used like
Distinguished Fields. They are “more expensive” then Distinguished Fields and typically should only be used when you need to do Context Based Routing on these values. These are also read/write (in most cases). BizTalk Server provides several context properties but you can create as many more as you like using a custom property schema.
How does something get promoted? A lot of items are promoted by BizTalk for you at various points in the process. You can also promote items yourself using Promotion inside a schema or by using a custom pipeline. It all depends on what you want to accomplish.
More information on Promoted Properties can be found inside the help guide.
Have you seen this error when installing BizTalk 2004?
Failed to deploy BizTalk system assembly “C:\Program Files\Microsoft BizTalk Server 2004\Microsoft.BizTalk.GlobalPropertySchemas.dll”.
Unspecified exception: An error occurred while enlisting in a distributed transaction.
I ran into this a few weeks ago when trying to install BizTalk 2004 on a Windows 2003 Server with SP1 preloaded and using a remote SQL Server.
It appears that like Windows XP SP2, Windows SP1 changes some DTC settings. This does not affect BizTalk when SQL is running locally of course.
After working with Microsoft Support for about 2 days. It turned out that the fix is rather quit easy. In our case, we had some other issues that made it seem much more complex then it was.
To correct this problem, go to Component Services, My Computer Properties, DTC tab, and then Security Configurations (bottom left).
1. Follow the standard BizTalk Installation instructions for setting up DTC.
2. Under Client and Administration, make sure “Allow Remote Clients” is checked.
3. Under Transaction Manager Communication, make sure “No Authentication Required” is checked
The end result was changes to two registry settings:
\MSDTC\AllowOnlySecureRpcCalls is now 0
\MSDTC\TurnOffRpcSecurity is now 1
The UI now looked like this: