Microsoft.BizTalk.Operations panaudojimas informacijos paieškai
Situacija: orkestracija startuoja pagal "Following subcription" nuostatą, tačiau iš pradžių jokių message'ų ji dar negauna. Tokiu atveju atsidarę messages skiltį, nematysime nieko, ir visiškai neaišku kuriems duomenims orkestracija startavo. Tokiu atveju galime peržiūrėti subscription informaciją, ir pagal joje esančius duomenis nustatyti, kuriem verslo procesui orkestracija priklauso. BizTalk Administration Console leidžia peržiūrėti Subscribtion'us, tačiau neįmanoma atlikinėti paieškos pagal jų parametrus. Senas geras WMI deja nepateikia jokių funkcijų subscriptionų peržiūrai. Microsoft.BizTalk.Operations .NET klasė leidžia priėjimą prie visų proceso objektų, tad paieška galime atlikti per ją.
Tiesiog reikia įtraukti klasę C# projekte prie Using skilties, taip pat galima įtraukti į "References", kitaip neveiks InteliSense VisualStudio funkcionalumas.
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.BizTalk.Operations;
using System.IO;
namespace UsingBizTalkOperationsClass
{
class Program
{
static void Main(string[] args)
{
BizTalkOperations ops = new BizTalkOperations();
System.Collections.IEnumerable enumb = ops.GetServiceInstances();
// išsitraukiam visus instance'us
System.Collections.IEnumerator enumt = enumb.GetEnumerator();
while (enumt.MoveNext())
{
object inst = enumt.Current;
if (inst is MessageBoxServiceInstance)
// tikrinam ar gautas objektas tikrai yra Instance'as
{
MessageBoxServiceInstance msginst = inst as MessageBoxServiceInstance;
// čia galima įtraukti tikrinimą ar instance'as atitinka kokius nors kriterijus, pvz
// if (msginst.Class.ToString().Equals("Orchestration"))
Console.WriteLine("InstanceId: " + msginst.ID );
System.Collections.IEnumerator enumt2 = msginst.Subscriptions.GetEnumerator();
// žiūrėsim per subscriptionų aibę
while (enumt2.MoveNext())
{
object subscr = enumt2.Current;
Subscription subcr = subscr as Subscription;
Console.WriteLine("SubscriptionId" + subcr.SubscriptionID);
System.Collections.IEnumerator enumt3 = subcr.PredicateGroups.GetEnumerator();
// žiūrėsim per predicate'ų grupes
while (enumt3.MoveNext())
{
object predict = enumt3.Current;
PredicateGroup pregrp = predict as PredicateGroup;
System.Collections.IEnumerator enumt4 = pregrp.Predicates.GetEnumerator();
// žiūrėsim predicate'us ....
while (enumt4.MoveNext())
{
object pred = enumt4.Current;
Predicate predicate = pred as Predicate;
// cia galime tiesiogiai atlikti paieška pagal nuropdytus subscription parametrus
// pvz if (predicate.Name.Equals("OrderId") && predicate.PredicateValue.Equals("123456"))
Console.WriteLine(predicate.Name + ": " + predicate.PredicateValue);
}
}
}
}
}
}
}
}
Tiesa, reikia pastebėti kad procesas yra lėtokas, kadangi net 4 enumeracijos lygiai, tad verčiau imti tik tai ko reikia.