Question

LEON2 on Thu, 19 Jun 2008 03:12:17


leon2です。

 

解決の糸口が見つかればと思い投稿させていただきます。

同じような問題を解決された方がいらっしゃいましたらアドバイスをお願いします。

 

ASP.NETのWebアプリケーションでワークフローをホストさせているのですが、

SqlTrackingService

SqlWorkflowPersistenceService

の両方をWorkflowRuntimeに追加すると実行時に必ず、以下のようなInvalidOperationExceptionの例外が発生します。
「ID "7de3e22b-63a0-417c-b512-26bf0edf8f7f" のワークフローは状態の永続化ストアに見つかりませんでした。」

 

SqlWorkflowPersistenceServiceだけを使用した時は、ワークフローは永続化されていて例外にはなりません。

SqlTrackingServiceだけを使用した場合は、例外にはなりませんがトラッキング情報がありませんでした。

 

いろいろ調べてみたのですが、WebアプリケーションでSqlTrackingServiceを使用する際の制約事項といったものもなく何が原因なのかもわかっていない状況です。

 

以下、ワークフローランタイムを生成しサービスを追加するコードです。

Code Snippet

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        Dim conn As String = _
         ConnectionStrings("orderdbConnectionString").ConnectionString

        _WFRuntime = New WorkflowRuntime()
        Dim manualWorkflowSchedulerService As _
         New ManualWorkflowSchedulerService()
        _WFRuntime.AddService(manualWorkflowSchedulerService)
        Dim commitWorkBatchService As _
         New SharedConnectionWorkflowCommitWorkBatchService(conn)

        Dim dataService As _
         New System.Workflow.Activities.ExternalDataExchangeService()
        _WFRuntime.AddService(dataService)
        _OrderService = New OrderLocalServices.OrderService()
        dataService.AddService(_OrderService)

        Dim trackingService As New Tracking.SqlTrackingService(conn)
        _WFRuntime.AddService(trackingService)
        Dim presistenceService As _
         New SqlWorkflowPersistenceService(conn, True, TimeSpan.MaxValue, New TimeSpan(0, 0, 5))
        _WFRuntime.AddService(presistenceService)
       
        _WFRuntime.StartRuntime()

        Application.Add("WorkflowRuntime", _WFRuntime)
    End Sub

 

 

また、例外が発生する場所は以下のような場所です。

Code Snippet

Dim WorkflowInstanceId As New System.Guid(strWorkflowInstanceId)
Dim stateMachineInstance As New StateMachineWorkflowInstance(_WFRuntime, WorkflowInstanceId)

 

 

以上、よろしくお願いします。

Replies

Nobuyasu on Wed, 25 Jun 2008 06:40:03


下記URLが参考になりそうです。

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1261499&SiteID=1

UnloadOnIdleをPersistenceserviceのインスタンスを作るときのパラメータにすると大丈夫かもしれません。

SqlWorkflowPersistenceService servicioPersistencia = new SqlWorkflowPersistenceService(connectionString, unloadOnIdle, instanceOwnershipDuration, loadingInterval);

 

LEON2 on Thu, 26 Jun 2008 03:51:45


Nobuyasuさん、コメントありがとうございます。

 

 Nobhigh さんからの引用

下記URLが参考になりそうです。

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1261499&SiteID=1

UnloadOnIdleをPersistenceserviceのインスタンスを作るときのパラメータにすると大丈夫かもしれません。

SqlWorkflowPersistenceService servicioPersistencia = new SqlWorkflowPersistenceService(connectionString, unloadOnIdle, instanceOwnershipDuration, loadingInterval);

 

 

URL先のスレッドはとても参考になりました。

JuanManueMoyano氏は自分で問題を解決出来たようですね。成功例があると励みになります。

さて、私の方も少し進展がありました。

投稿以降、ASP.NET WebアプリケーションでWFをホストした他のサンプルでSqlWorkflowPersistenceService、SqlTrackingServiceの同時利用を試し、期待通りに永続化とトラッキング出来ているパターンを見つけました。

 

まだ成功パターンと失敗パターンの違いや例外発生の原因を理解できているわけではないので引き続き調査続行です。

もちろん、本スレッドで引き続き識者からのアドバイスを期待しています。

 

参考情報として以下に成功時のにサンプルプログラムを載せます。

このサンプルプログラムはIHttpHandlerを継承したハンドラクラスでProcessRequestが呼び出されるたびにWorkflowRuntimeと各種Serviceを生成しています。

呼び出されるたびに生成するというのが肝なようで、前回投稿で挙げたWebアプリケーションのグローバルメソッドApplication_StartでWorkflowRuntimeを生成して持ちまわるパターンでは相変わらず例外となります。(グローバルメソッドApplication_StartでWorkflowRuntimeを生成して持ちまわるというのは、MSDNライブラリのプログラミングガイドに示されていた方法なのですが・・・。)

 

Code Snippet

 

        public void ProcessRequest(HttpContext context)
        {
            // ブラウザが渡してきた変数を取得し Hashtable に入れる
            Hashtable ht = new Hashtable();
            foreach (string qryVar in context.Request.QueryString)
            {
                ht[qryVar] = context.Request.QueryString[qryVar];
            }
            foreach (string formVar in context.Request.Form)
            {
                ht[formVar] = context.Request.Form[formVar];
            }

            // ワークフローランタイムのプロビジョニング
            WorkflowRuntime wr = new WorkflowRuntime();

            ManualWorkflowSchedulerService mss = new ManualWorkflowSchedulerService();
            wr.AddService(mss);

            ExternalDataExchangeService exServ = new ExternalDataExchangeService();
            wr.AddService(exServ);

            ScreenStartupService buyServ = new ScreenStartupService(context, ht);
            exServ.AddService(buyServ);

            string conn = ConfigurationManager.AppSettings["DBconnectionString"];
            SharedConnectionWorkflowCommitWorkBatchService commitWorkBatchServ = new SharedConnectionWorkflowCommitWorkBatchService(conn);
            wr.AddService(commitWorkBatchServ);
            SqlWorkflowPersistenceService perServ = new SqlWorkflowPersistenceService(conn, true, TimeSpan.MaxValue, new TimeSpan(0, 2, 0));
            wr.AddService(perServ);
            SqlTrackingService trackServ = new SqlTrackingService(conn);
            wr.AddService(trackServ);

            wr.StartRuntime();

            // DB に眠っているインスタンスをたたき起こす! (または新規作成)
            Guid workflowId;
            if (ht.Contains("workflowId"))
            {
                workflowId = new Guid(ht["workflowId"].ToString());
                buyServ.FireProcess(workflowId, ht);
            }
            else
            {
                WorkflowInstance wi;
                wi = wr.CreateWorkflow(typeof(Workflow1));
                wi.Start();
                workflowId = wi.InstanceId;
            }
            mss.RunWorkflow(workflowId);

            // データベースにシリアライズ (次回の呼び出しで使用)
            wr.StopRuntime();
        }

 

 

以上、よろしくお願いします。

sk7474 on Tue, 08 Jul 2008 09:43:45


こんにちは! 中川俊輔です。

 

Nobuyasuさん、回答ありがとうございます。

 

LEON2さん、フォーラムのご利用ありがとうございます。

問題は解決されましたでしょうか?

Nobuyasuさんがご紹介してくださったスレッドにもありますが、

MS DTCの設定によってLEON2さんと同じエラーが出てしまうことがあるみたいですね。

もう調査されたかもしれませんが、紹介させていただきます。

SqlTrackingService and SqlWorkflowPersistenceService in a State Machine Workflow

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2329599&SiteID=1

Workflow with id "Guid" not found in state persistence store.
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1887089&SiteID=1

 

それでは!

 

この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。

コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。

LEON2 on Thu, 10 Jul 2008 05:08:24


LEON2です。

 

Nobuyasuさん、中川さん、サポートいただきありがとうございました。

MSDTCの設定変更によりエラーは発生しなくなりました。

 

今回の件で初めてMSDTC (Distributed Transaction Coordinator)を知りました。

WFの学習するなかでMSDTCの存在に気づけなかったのは、私はまだまだ勉強不足だということですね。

 

これからもフォーラムを利用させていただいて勉強を重ねていきたいと思います。

以上、ありがとうございました。

鈴木裕子 on Mon, 11 Aug 2008 09:04:51


LEON2 さん、こんにちは。

フォーラムオペレーターの鈴木裕子です

 

フォーラムがお役に立てたようで何よりです!

 

こちらの情報を多くの皆様に活用していただきたいと思いまして、

勝手ながら私のほうで、Nobuyasu さんのご投稿と弊社 中川の投稿に回答チェックを付けさせていただきました。

 

LEON2 さんはチェックの解除ができますので、もし不適切でしたら修正をお願いします。

また、引き続き情報がありましたら、遠慮なくご投稿くださいね。

 

これからも Forum をご活用ください!

それでは。