4.16. 終了ノードで止まってしまう¶
関連する現象
4.16.1. Internet Explorer10、Internet Explorer11 で処理した案件が一覧に表示されない¶
現象¶
IM-Workflow の処理(申請、承認等)を Internet Explorer10、Internet Explorer11 で行った場合、処理したユーザのデータが異常な形で保存されます。
正常な形のデータ(progress.xml)
<user> <auth cd="user0001"> <companyCode>company01</companyCode> <organizationSetCode>conmapnyset01<organizationSetCode/> <organizationCode>dept01</organizationCode> </auth> <executer cd="user0001"/> <operator cd="user0001"/> </user>異常な形のデータ(progress.xml)
<user> <auth cd="user0001"> <companyCode>company01^conmapnyset01^dept01</companyCode> <organizationSetCode/> <organizationCode/> </auth> <executer cd="user0001"/> <operator cd="user0001"/> </user>そのため、以下のような状態となる場合があります。
- 案件を正常に進めることができなくなる
- フロー・履歴画面で、フロー図が表示されない
- フロー・履歴画面で、処理履歴の一部が表示されない
条件¶
iWP / iAF に、Internet Explorer9 互換モードで動作させる Servlet Filter を設定していない
処理した案件が処理済(未完了案件/完了案件)に表示されない
フロー、履歴画面が正しく表示されない
処理時にログが出力される
jp.co.intra_mart.foundation.workflow.exception.WorkflowException: java.lang.NullPointerException at jp.co.intra_mart.system.workflow.engine.thread.WorkflowThreadExceptionHandlerImpl.execute(WorkflowThreadExceptionHandlerImpl.java:25) at jp.co.intra_mart.system.workflow.engine.thread.WorkflowThreadRunner.run(WorkflowThreadRunner.java:126) Caused by: java.lang.NullPointerException at jp.co.intra_mart.system.workflow.engine.thread.task.TemplateMailSendTask.createProcessMailReplaceMap(TemplateMailSendTask.java:557) at jp.co.intra_mart.system.workflow.engine.thread.task.TemplateMailSendTask.createReplaceMap(TemplateMailSendTask.java:369) at jp.co.intra_mart.system.workflow.engine.thread.task.TemplateMailSendTask.execute(TemplateMailSendTask.java:221) at jp.co.intra_mart.system.workflow.engine.thread.WorkflowThreadRunner.run(WorkflowThreadRunner.java:97)案件の終了処理でエラーが発生し、終了ノードで止まる
jp.co.intra_mart.foundation.workflow.exception.WorkflowException: jp.co.intra_mart.system.workflow.engine.common.EngineException: java.lang.NullPointerException at jp.co.intra_mart.system.workflow.engine.thread.WorkflowThreadExceptionHandlerImpl.execute(WorkflowThreadExceptionHandlerImpl.java:25) at jp.co.intra_mart.system.workflow.engine.thread.WorkflowThreadRunner.run(WorkflowThreadRunner.java:126) Caused by: jp.co.intra_mart.system.workflow.engine.common.EngineException: java.lang.NullPointerException at jp.co.intra_mart.system.workflow.engine.thread.task.MatterEndTask.execute(MatterEndTask.java:229) at jp.co.intra_mart.system.workflow.engine.thread.WorkflowThreadRunner.run(WorkflowThreadRunner.java:97) Caused by: java.lang.NullPointerException at jp.co.intra_mart.system.workflow.engine.thread.task.TemplateMailSendTask.createResultMailReplaceMap(TemplateMailSendTask.java:863) at jp.co.intra_mart.system.workflow.engine.thread.task.TemplateMailSendTask.createReplaceMap(TemplateMailSendTask.java:389) at jp.co.intra_mart.system.workflow.internal.manager.mail.TemplateMailSendManager.getMailReplaceMapData(TemplateMailSendManager.java:361) at jp.co.intra_mart.system.workflow.engine.core.event.ExtensionEventExecutor.executeMatterEndExtension(ExtensionEventExecutor.java:593) at jp.co.intra_mart.system.workflow.engine.thread.task.MatterEndTask.execute(MatterEndTask.java:186) ... 1 more
原因¶
製品の仕様です。
iWP / iAF に、Internet Explorer9 互換モードで動作させる Servlet Filter を設定していない状態での Internet Explorer10、Internet Explorer11 の利用はサポート対象外です。コラム
Internet Explorer10 以降の Internet Explorer は、これまでの Internet Explorer とは違い、HTML5とCSS3への対応を他のモダンブラウザと同様に積極的にサポートするようになっているため、これまでの Internet Explorer で動作していた HTML や CSS が動作しなくなっている部分が多数あります。これらの動作変更の影響により、上記事象が発生しております。
解決方法¶
iWP / iAF の場合
Internet Explorer10、Internet Explorer11 を Internet Explorer9 互換モードで動作させる Servlet Filter を公開しております。IM-Workflow 7.2 を Internet Explorer10、Internet Explorer11 をご利用の場合は、Servlet Filter を設定してください。Servlet Filter の設定方法は以下の2通りがあります。
現在お使いのWebPlatform/AppFramework Ver7.2 に Servlet Filter を設定する方法
intra-mart Developer Blog 「WebPlatform/AppFramework Ver7.2でIE10を利用可能にするServlet Filterを公開します。」 を参照してください。
iWP / iAF 7.2.6 以降を適用する
iWP / iAF 7.2.6 以降に同梱の readme.txt を参照し、Servlet Filter を設定してください。
注意
Servlet Filter を設定する前に Internet Explorer10、Internet Explorer11 によって処理を行った案件が既に存在する場合、Servlet Filter を設定しただけでは対象案件のデータは正常な状態とはなりません。対象の案件に対して「復旧方法」で記載の対応を行ってください。intra-mart Accel Platform の場合
- 対象外
復旧方法¶
異常な形で保存された案件の確認方法
本件の現象によって異常な形で保存された案件を確認するためには、以下の方法に従ってトランザクションファイル格納ディレクトリを検索します。
以下の条件を指定してトランザクションファイル格納ディレクトリの検索を実行します。
検索対象のディレクトリ
iWP / iAF の場合
storage/workflow/data/%ログイングループID%/transaction
intra-mart Accel Platform の場合
%PUBLIC_STORAGE_PATH%/im_workflow/data/%テナントID%/transaction
対象の案件の期間が特定できている場合には、下記の「対象案件の処理手順」を参考にトランザクションファイルの格納ディレクトリ配下の年月・日・時間を指定すると、検索に要する時間を短縮化できます。検索対象のファイル
トランザクションファイル progress.xml
検索文字列
- “<companyCode>^”
- “<companyCode>%会社コード%^”
コラム
Aのパターンは、所属なしのユーザが申請や承認を行った場合に登録される情報を対象としています。所属なしユーザによるワークフローの利用がない場合には、Bのパターンの検索のみで構いません。対象となる案件が確認できたら、以下の「対象案件の処理手順」に基づいて対応します。
対象案件の処理手順
対象案件に対し、サポートブラウザで再申請を行い、案件を再度処理する必要があります。
- 案件操作を行い、申請ノードに戻します。
- サポートブラウザで再申請を行います。
- 以降、サポートブラウザで順次処理を行います。
4.16.2. task.zipおよびtaskフォルダが存在しなくなり、案件終了できない¶
現象¶
最終承認が完了したはずが、該当案件が未完了一覧に表示されます。該当案件の履歴アイコンやフローアイコンを押下すると、エラーが発生し、参照することができません。また、該当案件のtask.zipファイルおよびtaskフォルダが存在しません。
解決方法¶
ありません。
復旧方法¶
事象が発生してしまった案件に対し、以下の手順を実行することで、案件操作が可能となります。
該当するシステム案件ID配下に”task”というディレクトリを作成し、以下のディレクトリを”task”にコピーしてください。
コピー元
<% StoregeService %>/storage/workflow/data/<% LoginGroupID %>/transaction/<% yyyyMM %>/<% dd %>/<% HH %>/<%システム案件ID%>/result/<%最終処理タスクID (prefix:"ep_") %>コピー先
<% StoregeService %>/storage/workflow/data/<% LoginGroupID %>/transaction/<% yyyyMM %>/<% dd %>/<% HH %>/<%システム案件ID%>/task/<%最終処理タスクID (prefix:"ep_") %>DBの「imw_t_actv_matter」テーブルの該当案件のレコードを特定します。
手順1で作成したディレクトリのファイル名 <%最終処理タスクID (prefix:”ep_”) %> を imw_t_actv_matter.last_process_id の値に置き換えます。
DBの「imw_t_actv_task」テーブルの該当案件のレコードを特定します。
imw_t_actv_task.system_matter_id が該当案件のシステム案件IDである imw_t_actv_task.node_id が該当案件の終了ノードIDである上記で特定したレコードの値で以下のファイルに対して操作を行います。
<% StoregeService %>/storage/workflow/data/<% LoginGroupID %>/transaction/<% yyyyMM %>>/<% dd %>/<% HH %>/<%システム案I%>/task/<%最終処理タスクID(imw_t_actv_matter.last_process_id(prefix:"ep_")) %>/progress.xml
終了ノードのノードIDで検索をします。
<node id="<% 終了ノードID %>"> <progress /> </node> 検索した上記を以下のXMLに置き換えます。※手順4で特定した値を以下のXML情報の該当箇所に適用します。<node id="<% 終了ノードID(imw_t_actv_task.node_id) %>"> <progress> <startDate><% タスク開始日時(imw_t_actv_task.start_date(yyyy/MM/dd HH:mm:ss.SSS))) %></startDate> <endDate /> <actionId></actionId> <user> <auth cd="imw^system"> <companyCode /> <organizationSetCode /> <organizationCode /> </auth> <executer cd="imw^system" /> <operator cd="imw^system" /> </user> <status> <id>mattercompletewait</id> <name>N/A</name> </status> <comment /> <processTime /> </progress> </node>
4.16.3. 案件の終了ノードでエラーが発生した案件に対して、ユーザプログラムの処理・利用者による操作を行わずに完了させる¶
対象バージョン¶
iWP / iAF の場合
- IM-Workflow 7.2.0 ~ 最新バージョン
intra-mart Accel Platform の場合
- 2012 Autumn(Alba) IM-Workflow 8.0.1 ~ 最新バージョン
原因¶
ユーザプログラムの処理で問題が発生している場合に発生する可能性が考えられます。この場合、案件操作によってノード移動を行っても、移動の際に再度ユーザプログラムが動作し、例外が発生するため、案件を終了することができません。
解決方法¶
iWP / iAF の場合
以下の手順を行うと、案件に設定されたユーザプログラム(アクション処理や到達処理、案件終了処理)を動作させることなく、管理者の操作のみで案件を終了することができます。
TableMaintenanceや各種DB管理ツールを用いて、対象の案件のトランザクションデータの格納場所を特定します。
対象のテーブル
未完了案件(imw_t_actv_matter)
検索条件
システム案件ID = system_matter_idの値 となるレコード
システム案件IDは、 情報収集 の「情報収集Tips」に記載の方法で確認します。確認項目
システム案件ID(system_matter_id)
ディレクトリパス(file_dir_path)
最終タスク処理ID(last_process_id)
対象の案件が参照しているルート定義の画面で、終了ノードと、終了ノードの直前のノードのノードIDを確認します。
手順 1 で確認した情報に基づいて、対象の案件のストレージ上のトランザクションデータのディレクトリ内のflow.xmlを編集します。[%Storage Service%]/workflow/data/[%ログイングループID%]/transaction/%YYYYMM%/%DD%/%HH%/%システム案件ID%/task/%sp_タスクID%/flow.xml
- /workflow/data/[%ログイングループID%]/transaction/%YYYYMM%/%DD%/%HH%/ の部分は「ディレクトリパス」の値です。
- /%システム案件ID%/ の部分は「システム案件ID」の値です。
- /%sp_タスクID%/ の部分は「最終タスク処理ID」の値です。
手順 2 で確認したノードIDの情報に基づいて、各ノードに一致する<node_id>の配下のユーザプログラムの設定情報(タグ)を削除します。削除範囲は、下記に示す4か所の<extensionPoint xxx>~</extensionPoint>です。この作業は、終了ノードや、終了ノードの直前のノードにユーザプログラムを設定している場合に、案件操作によって意図しない処理が行われることを防ぐために行います。
案件終了処理
案件終了処理プログラム
<extensionPoint name="jp.co.intra_mart.workflow.plugin.event.matter.end.process"> ・・・中略・・・ </extensionPoint>終了ノード
到達処理プログラム
<node id="%終了ノードのID%"> ・・・ <extensionPoint name="jp.co.intra_mart.workflow.plugin.event.node.arrive.process"> ・・・中略・・・ </extensionPoint> ・・・ </node>終了ノードの直前に配置されているノード
アクション処理プログラム
<node id="%終了ノードの直前に配置されているノードのID%"> ・・・ <extensionPoint name="jp.co.intra_mart.workflow.plugin.event.node.action.process"> ・・・中略・・・ </extensionPoint> ・・・ </node>到達処理プログラム
<node id="%終了ノードの直前に配置されているノードのID%"> ・・・ <extensionPoint name="jp.co.intra_mart.workflow.plugin.event.node.arrive.process"> ・・・中略・・・ </extensionPoint> ・・・ </node>案件操作で、処理中のノードを終了ノードの1つ前のノードに戻します。
案件操作で、対象の案件の状態を終了ノードに移動させると、案件が完了します。
intra-mart Accel Platform の場合
以下の手順を行うと、案件に設定されたユーザプログラム(アクション処理や到達処理、案件終了処理)を動作させることなく、管理者の操作のみで案件を終了することができます。
TableMaintenanceや各種DB管理ツールを用いて、対象の案件のトランザクションデータの格納場所を特定します。
対象のテーブル
未完了案件(imw_t_actv_matter)
検索条件
システム案件ID = system_matter_idの値 となるレコード
システム案件IDは、 情報収集 の「情報収集Tips」に記載の方法で確認します。確認項目
システム案件ID(system_matter_id)
ディレクトリパス(file_dir_path)
最終タスク処理ID(last_process_id)
対象の案件が参照しているルート定義の画面で、終了ノードと、終了ノードの直前のノードのノードIDを確認します。
手順 1 で確認した情報に基づいて、対象の案件のストレージ上のトランザクションデータのディレクトリ内のflow.xmlを編集します。[%PUBLIC_STORAGE_PATH%]/im_workflow/data/[%テナントID%]/transaction/%YYYYMM%/%DD%/%HH%/%システム案件ID%/task/%sp_タスクID%/flow.xml
- /im_workflow/data/[%テナントID%]/transaction/%YYYYMM%/%DD%/%HH%/ の部分は「ディレクトリパス」の値です。
- /%システム案件ID%/ の部分は「システム案件ID」の値です。
- /%sp_タスクID%/ の部分は「最終タスク処理ID」の値です。
手順 2 で確認したノードIDの情報に基づいて、各ノードに一致する<node_id>の配下のユーザプログラムの設定情報(タグ)を削除します。削除範囲は、下記に示す4か所の<extensionPoint xxx>~</extensionPoint>です。この作業は、終了ノードや、終了ノードの直前のノードにユーザプログラムを設定している場合に、案件操作によって意図しない処理が行われることを防ぐために行います。
案件終了処理
案件終了処理プログラム
<extensionPoint name="jp.co.intra_mart.workflow.plugin.event.matter.end.process"> ・・・中略・・・ </extensionPoint>終了ノード
到達処理プログラム
<node id="%終了ノードのID%"> ・・・ <extensionPoint name="jp.co.intra_mart.workflow.plugin.event.node.arrive.process"> ・・・中略・・・ </extensionPoint> ・・・ </node>終了ノードの直前に配置されているノード
アクション処理プログラム
<node id="%終了ノードの直前に配置されているノードのID%"> ・・・ <extensionPoint name="jp.co.intra_mart.workflow.plugin.event.node.action.process"> ・・・中略・・・ </extensionPoint> ・・・ </node>到達処理プログラム
<node id="%終了ノードの直前に配置されているノードのID%"> ・・・ <extensionPoint name="jp.co.intra_mart.workflow.plugin.event.node.arrive.process"> ・・・中略・・・ </extensionPoint> ・・・ </node>案件操作で、処理中のノードを終了ノードの1つ前のノードに戻します。
案件操作で、対象の案件の状態を終了ノードに移動させると、案件が完了します。
コラム
ワークフローパラメータの設定で、トランザクションファイルの保存先設定を「BLOBデータとしてデータベースに保存する。」としている場合には、一度トランザクションファイルをBLOBデータからXMLデータに変換した上で対応を行います。以下の手順で操作してください。
- 「サイトマップ」→「テナント管理」→「ジョブ管理」→「ジョブ設定」をクリックします。
- ジョブ一覧から「 IM-Workflow 」→「未完了案件XMLデータ移行(Database LOB->File)」をクリックします。
- 「このジョブを編集する」をクリックします。
- 「実行パラメータ」を以下の通りに変更します。
- systemMatterId : 対象の案件のシステム案件ID
- deleteFlag : true
- 「この内容でジョブを更新する」をクリックします。
- 「サイトマップ」→「テナント管理」→「ジョブ管理」→「ジョブネット設定」をクリックします。
- ジョブネット一覧から「 IM-Workflow 」→「未完了案件XMLデータ移行(Database LOB->File)」をクリックします。
- 「このジョブネットを編集する」をクリックします。
- トリガ設定を変更し、「未完了案件XMLデータ移行(Database LOB->File)」のジョブネットを実行します。
- この後は、上の「 intra-mart Accel Platform の場合」の手順に従って操作し、案件を完了します。