Biztalk Administration Console olmadan, DB ye bakmak suretiyle Biztalk dan gelip geçen mesajları görmeniz pek mümkün olmamaktadır.
DB’yi ne kadar kurcalarsanız kurcalayın, Table lardaki bilgilerin (TrackingDB deki) anlamsız (okunamaz) durumda olduğunu göreceksiniz.
Peki Örneğin Bir Web Service veya Bir Web Sayfasında, Biztalk Server üzerinden gelip geçen mesajları ve mesajların içeriklerini nasıl gösterebiliriz?
Kullanabileceğiniz Metodlar Şöyle :
usings;
Altı çizili olan dll leri Biztalk un kurulduğu dizin içerisinde bulabilirsiniz;
Definitions;
private string TrackingServer = "Biztalk SQL Server";
private string TrackingDB = "DTA DB";
Biztalk SQL Server : Biztalk Server ın DB sinin bulunduğu server (local vs olabilir).
DTA DB : Tracking DB nizin adı, değiştirmediyseniz BiztalkDTAdb olmalı.
GetServiceMessages Metodu;
public Collection<BTMsgInstance> GetServiceMessages(string ServiceInstanceId)
{
Collection<BTMsgInstance> collection = new Collection<BTMsgInstance>();
Operations.BizTalkOperations ops = new Microsoft.BizTalk.Operations.BizTalkOperations();
Operations.TrackingDatabase tdb = new Microsoft.BizTalk.Operations.TrackingDatabase(TrackingDB, TrackingServer);
Operations.MessageFlow flow = ops.GetMessageFlow(new Guid(ServiceInstanceId), tdb);
foreach (Operations.MessageEvent message in flow.MessageEvents)
{
BTMsgInstance instance = new BTMsgInstance
{
EndTime = message.RoutingDetails.Source.EndTime,
StartTime = message.RoutingDetails.Source.StartTime,
InstanceID= message.RoutingDetails.Source.InstanceID,
ErrorInfo = message.RoutingDetails.Source.ErrorInfo,
ExitCode = message.RoutingDetails.Source.ExitCode,
ServiceName = message.RoutingDetails.Source.ServiceName
};
collection.Add(instance);
}
return collection;
}
GetTrackedMessageData Metodu;
public string GetTrackedMessageData(string MessageInstanceId)
{
Operations.BizTalkOperations ops = new Microsoft.BizTalk.Operations.BizTalkOperations();
Operations.TrackingDatabase tdb = new Microsoft.BizTalk.Operations.TrackingDatabase(TrackingDB, TrackingServer);
Guid guid = new Guid(MessageInstanceId);
IBaseMessage trackedMessage = ops.GetTrackedMessage(guid);
IBaseMessagePart part = trackedMessage.BodyPart;
Stream stream = part.Data;
StreamReader reader = new StreamReader(stream);
return string.Format(CultureInfo.CurrentCulture, "0", new object[] { reader.ReadToEnd() });
}
Unutmadan yukarıdaki kodun çalışması için Biztalk Server üzerinde bir IIS’ e kurmanızı öneririm, zira kodlar yetki ile ilgili problemlerden dolayı çalışmayabilirler. Bu yüzden bu metodları bir web service olarak hazırlamanız en iyisi olacaktır. Daha sonra yapacağınız ayrı bir web uygulaması ile de bu metodları çağırıp gerekli bilgileri alabilirsiniz.
GetServiceMessages metodu, Bir servisin Instance ID sini input olarak alır ve BTMsgInstance sınıfında bir değişken döndürür. Bunun içinde EndTime, StartTime, InstaceID, ErrorInfo, ExitCode, ServiceName gibi bilgiler bulunmaktadır.
GetTracketMessageData metodu ise Message Instance ID si verilen bir mesajın içeriğini XML olarak bize döndürür.
Bu kadar bilgiden sonra lan olm iyi güzelde ServiceName ve ServiceInstanceID lerini nereden bulacam da bu metodlara gönderip sonuçları alacam diyebilirsiniz. Demelisiniz de
Onu da düşündüm, onu da anlatıcam size
ServiceName leri bulabilmek için aşağıdaki SQL i çalıştırıyoruz,
SELECT DISTINCT sf.[Service/Name] AS [Service Name]
FROM [dtav_ServiceFacts] sf
WHERE sf.[Service/Name] IS NOT NULL;
ServiceInstanceID leri bulabilmek için de aşağıdaki SQL e, ServiceName gönderiyoruz
SELECT sf.[Service/Name] AS [Service Name], sf.[ServiceInstance/InstanceId] AS [Service Instance Id]
FROM [dtav_ServiceFacts] sf
WHERE sf.[Service/Name] = '" + serviceName + "'
ORDER BY sf.[ServiceInstance/StartTime] DESC
Daha da detaylı bilgi gerekirse dtav_ServiceFacts tablosundaki verileri inceleyebilirsiniz.
Son 10 mesajın Bilgilerini getiren SQL;
SELECT TOP 10
sf.[ServiceInstance/InstanceId] AS [Service Instance Id],
sf.[Service/Name] AS [Service Name], sf.[ServiceInstance/State] AS [State] ,
dateadd(minute, 180, sf.[ServiceInstance/StartTime]) AS [Start Time],
dateadd(minute, 180, sf.[ServiceInstance/EndTime]) AS [End Time],
sf.[ServiceInstance/Duration] AS [Duration],
sf.[ServiceInstance/ExitCode] AS [Error Code],
FROM [dtav_ServiceFacts] sf
WHERE sf.[Service/Name] IS NOT NULL
AND sf.[Service/Type]='Orchestration'
ORDER BY [Start Time] DESC



