1

マルチスレッド製品である BizTalk で UniObjects.NET を使い始めるまでは、問題なく UniObjects.NET を使用していました。問題は以下のエラーです。このエラーは、2 番目のスレッド (およびおそらく 3 番目、4 番目などのスレッド) でのみ発生します。最初のスレッドが接続され、UniData からデータを正常に取得できます。エラーはあまり意味がなく、検索では特定の問題を扱っていない結果が 1 つしか返されません。誰かがアンサーを持っているか、私を正しい方向に向けることができますか? このエラーは、接続プールが有効になっていない場合に発生します。接続プールは他のエラーをスローするため、使用していません。

注意すべきもう 1 つの点は、デバッグ中に、各スレッドが個別のファイルにデバッグ情報を書き込むコードを記述したことです。デバッグ情報をファイルに書き込むだけで、両方のスレッドが正しく動作しました。これは接続タイミングの問題 (つまり、同時に UniSession を開く) ではないと思います。これは、UniData ファイルに同時にアクセスする時点でのみ失敗するためです (同時に仮定すると)。

使用している UniObjects.NET の 2.2.3.7377 (2010 年 5 月) ファイル バージョンの UniObjects.NETドキュメントUniData のバージョンは 7.2 です。

更新: UniObjects.NET バージョン 2.2.5.7463 でも試してみましたが、それでも同じ例外がスローされます。

内部例外: GetX - ファイル 'MYFILEX' のエラー。[IBM U2][UODOTNET - UNIRPC][ErrorCode=81004] 無効なタイプの引数が RPC から要求されました

例外の種類: 例外
ソース: MyBusinessObjects
ターゲット サイト: System.Collections.Generic.List`1[MyBusinessObjects.XResponse] GetX(System.Collections.Generic.List`1[MyBusinessObjects.Lookup])
以下は、例外が発生した場所を特定するスタック トレースです。
  MyBusinessObjects.Lookups.GetX (List`1 Lookups) で
  MyBusinessObjects.Integration.GetXResponses (XmlDocument xml、文字列ヘッダー、文字列 gheader) で
  Orchestrations.XProcess.segment1 (StopConditions stopOn) で
  Microsoft.XLANGs.Core.SegmentScheduler.RunASegment (セグメント s、StopConditions stopCond、Exception& exp) で

更新:読書リストを扱う同じエラー。

内部例外: [IBM U2][UODOTNET - UNIRPC][ErrorCode=81004] 無効なタイプの引数が RPC から要求されました

例外の種類: UniRPCPacketException
ソース:
UniRPCPacket クラス
ターゲット サイト: Byte[] ReadByteArray(Int32)
以下は、例外が発生した場所を特定するスタック トレースです。

   IBMU2.UODOTNET.UniRPCPMessage.ReadByteArray(Int32 anIndex) で
   IBMU2.UODOTNET.UniSelectList.ReadList() で
   IBMU2.UODOTNET.UniSelectList.ReadListAsStringArray() で
   MyBusinessObjects.Lookups.GetY() で
   MyBusinessObjects.Integration.GetResponses (XmlDocument xml、文字列ヘッダー、文字列 gsheader) で
   Orchestrations.Process.segment1 (StopConditions stopOn) で
   Microsoft.XLANGs.Core.SegmentScheduler.RunASegment (セグメント s、StopConditions stopCond、Exception& exp) で
4

1 に答える 1

0

この問題は解決されました。これで最新の UO.NET を使用できるようになりました。この問題が解決されることを願っています。「U2 Toolkit for .NET」と呼ばれる新しい Rocket ソフトウェア製品も使用できます。これは、ADO.NET、UO.NET、および LINQ to Entity 機能を含む統合ソリューションです。マルチスレッドをテストするには、(BiZtalk サーバーの代わりに) 次のコードを使用できます。PLINQ と U2 Toolkit for .NET を使用しました。

class Program
{
    static int NumberofThreads = 20;
    const string uniFileName = "PRODUCTS";
    static UniFile file = null;
    static UniSession session = GetUniSession();
    // setup ok/error counters
    static int ok = 0;
    static int error = 0;
    static void Main(string[] args)
    {
        // connect with no locks
        session.BlockingStrategy = UniObjectsTokens.UVT_WAIT_LOCKED;
        session.LockStrategy = UniObjectsTokens.UVT_NO_LOCKS;
        session.ReleaseStrategy = UniObjectsTokens.UVT_WRITE_RELEASE;
        Stopwatch watch = new Stopwatch();
        watch.Start();
        // take only 20 distinct record ids
        List<string> recordIds = new List<string>(RecordIds());
        // run as parallel
        Parallel.ForEach(recordIds, x =>
        {
            try
            {
                // connect to UniData CM file
                var file2 = session.CreateUniFile(uniFileName);
                // read individual record id
                file2.Read(x);
                file2.Close();
                Interlocked.Increment(ref ok);
                Console.WriteLine("rec id:" + x);
            }
            catch (Exception ex)
            {
                Interlocked.Increment(ref error);
                Console.WriteLine("Claim: {0}. Error: {1}", x, ex.Message);
            }
        });
        // set count & setup threads
        int count = 0;
        watch.Stop();
        // write error
        Console.WriteLine("Time: {2}, Count: {3}, OK: {0}, Error: {1}", ok, error, watch.Elapsed, count);
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
    static UniSession GetUniSession()
    {
        U2ConnectionStringBuilder conn_str = new U2ConnectionStringBuilder();
        conn_str.UserID = "user";
        conn_str.Password = "pass";
        conn_str.Server = "localhost";
        conn_str.Database = "XDEMO";
        conn_str.ServerType = "UNIDATA";
        conn_str.AccessMode = "Native";   // FOR UO
        conn_str.RpcServiceType = "udcs"; // FOR UO
        conn_str.Pooling = false;
        string s = conn_str.ToString();
        U2Connection con = new U2Connection();
        con.ConnectionString = s;
        con.Open();
        Console.WriteLine("Connected.........................");
        U2.Data.Client.UO.UniSession us1 = con.UniSession;
        if (file == null)
        {
            file = us1.CreateUniFile(uniFileName);
        }
        return us1;
    }

    public static List<string> RecordIds()
    {
        List<string> lRECIDList = new List<string>();
        UniSelectList sl = session.CreateUniSelectList(2);

        // Select UniFile
        UniFile fl = session.CreateUniFile("PRODUCTS");
        sl.Select(fl);

        bool lLastRecord = sl.LastRecordRead;
        int lIndex = 0;
        while (!lLastRecord)
        {
            string s4 = sl.Next();
            lRECIDList.Add(s4);
            //Console.WriteLine("Record ID:" + s4);
            lLastRecord = sl.LastRecordRead;
            lIndex++;
            if (lIndex >= NumberofThreads)
            {
                break;
            }
        }
        return lRECIDList;

    }
}
于 2012-05-24T22:26:19.087 に答える