1

WMI クエリに問題があります。WMI クエリを使用して、BizTalk でインスタンスを検索して再開します。インスタンスがそれほど多くない場合 (つまり、データがそれほど多くない場合)、クエリはかなりうまく機能します。しかし、データが大きい場合 (約 3000 インスタンス)、クエリの実行に約 6 ~ 10 秒かかり、これは許容できません。

コードは次のとおりです。

string query = "SELECT * FROM MSBTS_ServiceInstance WHERE InstanceID = \"" + OrchestrationId + "\"";
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(new ManagementScope(@"root\MicrosoftBizTalkServer"), new WqlObjectQuery(query), null);
    int count = searcher.Get().Count;
    if (count > 0)
    {
        string[] strArray = new string[count];
        string[] strArray2 = new string[count];
        string[] strArray3 = new string[count];
        string str2 = string.Empty;
        string str3 = string.Empty;
        int index = 0;
        foreach (ManagementObject obj2 in searcher.Get())
        {
            if (str2 == string.Empty)
            {
                str2 = obj2["HostName"].ToString();
            }
            strArray2[index] = obj2["ServiceClassId"].ToString();
            strArray3[index] = obj2["ServiceTypeId"].ToString();
            strArray[index] = obj2["InstanceID"].ToString();
            str3 = str3 + string.Format("  {0}\n", obj2["InstanceID"].ToString());
            index++;
        }
        new ManagementObject(string.Format("root\\MicrosoftBizTalkServer:MSBTS_HostQueue.HostName=\"{0}\"", str2)).InvokeMethod("ResumeServiceInstancesByID", new object[] { strArray2, strArray3, strArray, 1 });

データが大きくなるときに時間がかかるのは、最初のクエリ (Select * from MSBS_ServiceInstance..) です。

これを改善する方法はありますか?プラットフォームは Windows Server 2008 Enterprise です。

どうも!

4

2 に答える 2

2

中断されたものだけでなく、オーケストレーションのすべてのサービス インスタンスを取得しているようです。

クエリの where 句に次を追加してみてください。これにより、中断されたサービス インスタンスと中断された再開不可能なサービス インスタンスのみが返されます。

and (ServiceStatus = 4 or ServiceStatus = 16)
于 2011-05-13T16:17:09.933 に答える
0

返信ありがとうございます。多くの中断されたインスタンスが時々発生する理由は、設計によるものです。メッセージが連続していない場合は常に、前のメッセージが通過するまでオーケストレーションが中断されます。BizTalk と共にインストールされる BizTalkOperations クラスを使用して、インスタンスを再開する別の方法を見つけました。

BizTalkOperations operations = new BizTalkOperations(dataSource, initialCatalog);

foreach (Guid id in instanceIds)
{
     operations.ResumeInstance(id);
}

このコードは、WMI コードよりもはるかにパフォーマンスが優れています (しかもコードが少ない ^^) :)

ありがとう

于 2011-06-06T14:12:19.867 に答える