こんにちは SharePoint サポートの森 (kenmori) です。
SharePoint ワークフローでイベント通知が失敗する現象について、詳細な原因と対処策を記載させていただきます。
ワークフローでイベント通知が失敗した場合、以下のような診断ログが記録され、ワークフローが再開されなくなってしまいます。この現象に陥った場合は、通常、ワークフローを再起動する必要があります。
ワークフローをある程度、複雑に設計した場合にぶつかった方は多いかもしれません。この現象を防ぐために、ワークフロー設計段階で考慮しておく注意事項がございます。今回はイベント通知失敗の原因を記載させていただくとともに、本現象発生を防ぐための対処策をご紹介させていただきます。
診断ログ
Engine RunWorkflow: System.Workflow.Activities.EventDeliveryFailedException: インスタンス ID "998bb571-24fc-4662-801b-b57f6c0047ca" のインターフェイス型 "Microsoft.SharePoint.Workflow.ITaskService" のイベント "OnTaskChanged" は配信できません。 --->
System.NullReferenceException: オブジェクト参照がオブジェクトインスタンスに設定されていません。
場所 Microsoft.SharePoint.Workflow.SPWorkflowHostServiceBase.LoadInstanceData(Guid instanceId, Boolean& compressedData)
場所 Microsoft.SharePoint.Workflow.SPWinOePersistenceService.LoadWorkflowInstanceState(Guid instanceId)
場所 System.Workflow.Runtime.WorkflowRuntime.InitializeExecutor(Guid instanceId, CreationContext context, WorkflowExecutor executor, WorkflowInstance workflowInstance)
場所 System.Workflow.Runtime.WorkflowRuntime.Load(Guid key, CreationContext context, WorkflowInstance workflowInstance)
場所 System.Workflow.Runtime.WorkflowRuntime.GetWorkflow(Guid instanceId)
場所 System.Workflow.Activities.WorkflowMessageEventHandler.EventHandler(Object sender, ExternalDataEventArgs eventArgs)
--- 内部例外スタックトレースの終わり ---
場所 Microsoft.SharePoint.Workflow.SPWinOETaskService.RaiseEvent(SPWinOeWorkflow workflow, SPWorkflowEvent workflowEvent, Object workItem, IPendingWork workHandler)
場所 Microsoft.SharePoint.Workflow.SPWinOeHostServices.Send(SPWinOeWorkflow winoeworkflow, SPWorkflowEvent e)
場所 Microsoft.SharePoint.Workflow.SPWinOeEngine.RunWorkflow(Guid trackingId, SPWorkflowHostService host, SPWorkflow workflow, Collection`1 events, TimeSpan timeOut)
発生原因について
本現象は、1 つのワークフロー インスタンスがイベントによって複数同時に呼び出される際に、タイミングによって非常にまれに発生する場合があります。
ワークフロー ランタイムは実行中のワークフロー インスタンスをトラッキングしております。ワーク バッチを起動する時点でトラッキング一覧に登録し、ワークバッチを終了する時点で一覧より削除します。従って、1 つのワークフローインスタンスにつき、イベントが複数同時発生することによって、タイミングによってはトラッキングに競合を引き起こす可能性があります。
この場合、ランタイム側の処理で、イベントを通知する先であるワークフロー インスタンスがトラッキング中のインスタンス一覧から正しく取得できない (NullReferenceException) ことによりイベント通知が失敗 (EventDeliveryFailedException) すると考えられます。
なお、スレッド間の極めて微妙なタイミングによって発生する事象であるため、環境によっては本事象が全く発生しない場合もあります。
参考情報
タイトル : SharePoint ワークフローのチューニング
アドレス : http://blogs.technet.com/b/sharepoint_support/archive/2011/01/12/sharepoint.aspx
注意事項と対処策
本現象はSharePoint ワークフローを実装するアーキテクチャ上の制限に起因するため、対処するためには上記現象の発生要因をふまえワークフローの設計を変更する必要がございます。
現象の発生を防ぐためには、特にワークフローの設計時に以下の点に注意する必要がございます。
1. ParallelActivity, ReplicatorActivity, ConditionedActivityGroup (CAG) Activity などによって、複数のイベントを同時に待たないようにする。
本現象を最大限引き起こさないようにする対処策としては、イベントを同時実行から順次実行にするよう設計変更するか、ワークフローインスタンスを分割し 1 イベント 1 ワークフロー インスタンスで実行できるよう設計変更する方法があります。
2. ワークフロー インスタンス内で、タスクの作成 (CreateTaskActivity) の次にタスク作成イベント (OnTaskCreated) を配置するなど、インスタンス内でイベントを発生させ、インスタンス内でそのイベントを検知するような実装を避ける。
この実装を必要とする背景として、CreateTaskActivity などを実行した際に、実行結果がワークフローインスタンスのアンロードまでデータとしてコミットされないためにタスクの ID 等が取得できない背景があります。
コミットされた値をどうしても取得したい場合は、永続性サービスの動作を考慮し、ワークフローインスタンスを一度永続化することによって、データを強制的にコミットさせることが可能となります。現実的な対処策としては以下がございます。
対処方法
1) DelayActivityアクティビティなどを使用し、ワークフローをアイドル状態にする
2) PersistOnCloseAttribute属性を使用するカスタム アクティビティを実行する
方法 1) は、時間がかかるデメリットはありますが、開発工数を抑えてご要望を実装できる方法となります。方法 2) は、即座にインスタンスを永続化し、コミットさせることができる方法となります。
いずれかをご検討ください。
なお、2. に関しては以下のサポート技術情報にも紹介されております。
タイトル : After you start a workflow on a server that is running SharePoint Services 3.0, you receive an error message that states an error has occurred in the workflow
アドレス : http://support.microsoft.com/kb/970548
(2013/02/04 補足)
類似の現象について、以下のページでご紹介しております。合わせてご参考にしていただけますと幸いです。
http://blogs.technet.com/b/sharepoint_support/archive/2013/02/04/system-workflow-activities-eventdeliveryfailedexception-part-2.aspx
こんにちは
Office サポートのかわぞえです。
はじめに 3月11日(金)に発生した東北地方太平洋沖地震により、被災された皆様、そのご家族の方々に対しまして、心よりお見舞い申し上げます。
今回の地震の影響は地震自体の被害、津波による被害、さらには原発の影響等計り知れないものがあります。また、直接の被害だけでなく、避難生活が続くことによる精神的ストレスなどもあるかと思います。
自分の子供達も地震や映像として映し出された状況を目の当たりにし、家から出ない、親から離れようとしない等、普段と全く違った行動をする場面もありました。(お医者様によると、ショックにより上記のような行動をとる場合もあるそうです)
また、サポート部門が普段在席している東京都調布市にある調布テクノロジーセンターでも輪番停電の影響をうけ、ビルの停電等が実施されています。そのため、お客様にご迷惑をお掛けしないよう、3月現在はサポート部隊は現在各地のオフィスに分散して、サポートを続けている状況です。お客様からの直接のご連絡をお受けできないなどご不便をおかけすることがありますが、どうぞご理解、ご協力いただければ幸いです。
では、サポートチームブログの内容に進みたいと思います。
今回取り扱うのは SharePoint 2010 での検索です。
SharePoint では、SharePoint サイトだけでなく、Office 文書や HTML 等のコンテンツ等もクロールして、インデックス付けすることができます。また、各製品ベンダー様から提供いただく iFilter を使用することで、独自のファイル形式についてもクロールすることができます。よくお問い合わせいただくのは PDF 形式のファイルです。SharePoint 2007 では、以下のサポート技術情報にある方法で、WSS 3.0 および MOSS 2007 のいずれでもクロール、インデックス付けすることができました。
32 ビット版の Office SharePoint Server 2007 および Windows SharePoint Services 3.0 において、Adobe PDF IFilter 8 および Adobe PDF IFilter 9 を使用し PDF ドキュメントを検索する方法 http://support.microsoft.com/kb/960628/ja
32 ビット版の Office SharePoint Server 2007 および Windows SharePoint Services 3.0 において、Adobe PDF IFilter 8 および Adobe PDF IFilter 9 を使用し PDF ドキュメントを検索する方法
http://support.microsoft.com/kb/960628/ja
SharePoint 2010 でも同じ仕組みで、iFilter を使用することで、独自形式のファイルフォーマットをクロール対象とすることができます。SharePoint 2010 では、以下のサポート技術情報 (残念ながら、まだ英語版のみです) で、PDF ファイルをクロール対象とすることが可能です。
SharePoint 2010 - Configuring Adobe PDF iFilter 9 for 64-bit platforms
http://support.microsoft.com/kb/2293357/en-us
これで万事 OK ですね。。。。といいたいところですが、何か足りません。そうです、SharePoint Foundation 2010 の記述がありません。
では、WSS 3.0 と同じ手法で試して、、、うまくいきません。
実は、SharePoint Foundation 2010 では、WSS 3.0 と設定方法が異なっており、WSS 3.0 と同じ手法だとうまくいかないのです。SharePoint Foundation 2010 では以下の手法で対処可能ですので、おためしください。
手順概要 (ここでは、サポート技術情報と歩調をあわせ、Adobe 社様の iFilter を使用いたします)
======================================================
1. PDF iFilter のインストール
2. ファイルの種類を追加する
3. レジストリを編集する
4. SharePoint Foundation Search V4 サービスを再起動する
5. PDF アイコンを追加する
6. 動作確認
--------------------------------
"Adobe PDF iFilter 9 for 64-bit platforms" をダウンロードし、SharePoint Foundation サーバーにインストールします。(ファーム構成の場合は、SharePoint Foundation Search が動作する検索サーバーにインストールします)
<参考>
Adobe PDF iFilter 9 for 64-bit platforms
http://www.adobe.com/support/downloads/detail.jsp?ftpID=4025
注意 : 本投稿に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。明示または黙示にかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。
また、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。
2. ファイルの種類を追加する (PDF)
--------------------------------------
1). 以下のスクリプトをAddExtension.vbs として保存いたします。
----- ここから -----
Sub Usage
WScript.Echo "Usage: AddExtension.vbs extension"
WScript.Echo
end Sub
Sub Main
if WScript.Arguments.Count < 1 then
Usage
wscript.Quit(1)
end if
dim extension
extension = wscript.arguments(0)
Set gadmin = WScript.CreateObject("SPSearch4.GatherMgr.1", "")
For Each application in gadmin.GatherApplications
For Each project in application.GatherProjects
project.Gather.Extensions.Add(extension)
Next
End Sub
call Main
----- ここまで -----
2) [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。
3) cmd と入力し [OK] をクリックし、コマンド プロンプト ウィンドウを起動します。(管理者特権で実行されます)
4) コマンド プロンプトより、ファイルの種類を指定して、実行します。
<Cドライブ直下にスクリプトを配置した場合の実行例>
C:\>WScript AddExtension.vbs pdf
3. レジストリを編集する ------------------------ 1) ファーム内の SharePoint Foundation Search が実行されているサーバーにて、[スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックして regedit と入力し、[OK] をクリックしてレジストリ エディタを起動します。
------------------------
2) 次のレジストリ キーに移動します。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\14.0\Search\Setup\ContentIndexCommon\Filters\Extension\
3) 右クリックして、[新規] - [キー] をクリックして、".pdf" と入力します。
4) [既定] を右クリックし、[修正] メニューをクリックします。
5) [値のデータ] ボックスに以下の GUID の値を指定します。
{E8978DA6-047F-4E3D-9C78-CDBE46041603}
6) [ファイル] メニューの [レジストリ エディタの終了] をクリックして、レジストリ エディタを終了します。
注:なお、レジストリは編集前にバックアップしておいてくださいね。
-------------------------------------------------------
1) SharePoint Foundation Search が実行されているサーバーにおいて、管理者権限でコマンド プロンプトを実行します。
2) コマンド プロンプトに以下のコマンドを入力し Enter キーを押して、SharePoint Foundation Search V4 サービスを停止します。
net stop spsearch4
3) コマンド プロンプトに以下のコマンドを入力し Enter キーを押して、SharePoint Foundation Search V4 サービスを再開します。
net start spsearch4
---------------------------
1)以下フォルダに PDF 用のアイコン ファイルを Adobe 社様の Web サイト等からダウンロードして、保存します。
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\Template\Images
2) 以下フォルダにある "DOCICON.XML" をメモ帳などで開きます。
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\Template\Xml
3) "DOCICON.XML" ファイル内にある <Mapping Key> タグに以下の 拡張子 [*.pdf] 用のエントリを追加します。ここでは、pdf のアイコンファイル名として、pdf.gif を指定しております。
<Mapping Key="pdf" Value="pdf.gif"/>
4) 管理者として実行したコマンド プロンプトから、"iisreset /noforce" コマンドを実行して IIS をリセットします。
注意 : 上記手順は、ファーム内のすべての Web フロント エンド サーバーにて実施致します。
-------------
手順 1 から 5 までを完了した後、サイトのフル クロールを実行し、PDF ファイルが検索可能となることを確認します。
1)管理者として実行したコマンド プロンプトから、以下のディレクトリに移動します。
>C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\bin
2) 以下のコマンドを実施して、フルクロールを実行します。
>stsadm -o spsearch -action fullcrawlstart
いかがでしたでしょうか。
今回は SharePoint 2010 における iFilter の登録方法についてご紹介させて頂きました。
SharePoint 2010 では、検索のみならず、サービスという観点でのアーキテクチャが大幅に変更され、より柔軟に対応できるようになりました。
今回ご案内した検索機能でも様々な新機能、改良点がありますので、是非お試し下さい。
最後になりますが、今回の地震や津波、原発による被害等、震災による影響としてはまだ落ち着いている状況ではありません。
どうか一日も早く被災者の方々が落ち着いて暮らせるようにと願って止みません。
日本マイクロソフトは、被災地域の復興支援に、全力で取り組んでまいります。 日本マイクロソフトの被災地域への復興支援と対応について http://www.microsoft.com/japan/citizenship/disasterrelief/default.mspx MSN東北地方太平洋沖地震に関する役立つ情報 http://eastjapaneq.jp.msn.com/
日本マイクロソフトは、被災地域の復興支援に、全力で取り組んでまいります。
日本マイクロソフトの被災地域への復興支援と対応について
http://www.microsoft.com/japan/citizenship/disasterrelief/default.mspx
MSN東北地方太平洋沖地震に関する役立つ情報
http://eastjapaneq.jp.msn.com/