Questetra には、ユーザ自身がスクリプト(ECMAScript)を記述してオリジナル処理を定義することのできる自動処理工程[スクリプトタスク]と、インポートして追加することのできる自動処理工程[サービスタスク(Add-on)]があります。
([サービスタスク(Add-on)]には、公開されているサービスタスク定義やユーザ自身が自作したものがあります。)
2020年11月現在、[スクリプトタスク][サービスタスク(Add-on)]では、スクリプトエンジンとして「GraalJS」「Nashorn」「Rhino」を利用することができますが、「Rhino」につきましては 2021年7月リリース予定の Ver. 13.1 にて廃止されますのでお知らせいたします。
また、Rhino 廃止に伴い、Rhino でのみ利用可能な次の形式のデータ参照/更新方法も廃止されます。
- 参照:data.get(“1”)
- 更新:retVal.put(“1”, hogehoge)
つきましては、スクリプトエンジンに「Rhino」を利用している場合は、次の「廃止に伴う対応と振る舞い」をご確認のうえ、6月30日までに[スクリプトタスク][サービスタスク(Add-on)]ごとに下記の対応を進めていただきますようお願いいたします。
2021年1月18日にアップグレードされた Ver. 12.3 のワークフロー基盤(Questetra BPM Suite)において、「Rhino」が利用されているワークフローアプリについては、アプリ設定エラーとなるように対応されました。アプリ設定エラーとなっても、稼働しているワークフローアプリの動作に影響はありませんが、アプリの新バージョンを[リリース]する際は、エラーを解消していただく必要がございます。
◆ 「Rhino」廃止に伴う対応と振る舞い(2021-05-11 追記)
2021年5月現在、ワークフローアプリの最新バージョンにて「Rhino」が利用されている工程が含まれている場合、当該アプリの詳細画面では警告メッセージ(アプリの定義エラー)が表示されております。この状態でも「Rhino」が完全に廃止されるまでの間は実行時エラーとはならずこれまで通りスクリプトは動作しますが、「Rhino」廃止に伴い次のように振る舞うようになります。
- スクリプトタスク
- スクリプトエンジン「Rhino」を強制的に「GraalJS」に切り替える
- 記述されているコードによって、次のように振る舞いが変わる可能性があります
- スクリプト工程が「処理失敗(エラー)」となる
- スクリプト工程は正常終了するが、処理結果が変わる
- (これまでと同じ処理結果となる)
- サービスタスク(Add-on)
- スクリプトエンジンの設定変更は行われない(何もしない)
- <engine-type> 要素の値が「0」、または要素が未定義の場合、対象の工程は常に「処理失敗」となる
◆ スクリプトタスク
スクリプトエンジンの変更
- 「Rhino」から「GraalJS
/ Nashorn」へ変更 長期的には、「GraalJS」の利用を推奨- 「Nashorn」は JDK 11 にて非推奨となっており、Questetra でも、2021年10月に
近い将来、廃止される予定です予定となる見込みです
- 「Nashorn」は JDK 11 にて非推奨となっており、Questetra でも、2021年10月に
スクリプト(コード)の変更
スクリプト内にて、廃止される形式でのデータ参照/更新を行っている場合や E4X を利用した XML 処理を行っている場合は、コードの修正が必要となります。
- データ参照/更新の方法を変更
- 参照:data.get(“データ定義番号”)
=> engine.findDataByNumber(“データ定義番号”)、engine.findDataByVarName(“フィールド名”)、など - 更新:retVal.put(“データ定義番号”, データ型に応じた形式の値)
=> engine.setDataByNumber(“データ定義番号”, データ型に応じた形式の値)、engine.setDataByVarName(“フィールド名”, データ型に応じた形式の値)、など - 「フィールド名」を利用した形式を推奨
- 関連ドキュメント:R2301: Scriptデータ取得/代入
- 参照:data.get(“データ定義番号”)
- XML 処理の変更
- E4X を利用した処理から、XPath 式を利用する方式へ変更
- 関連ドキュメント:R2300: スクリプトタスクで利用できる Java クラス
- XPathWrapper
- XPathWrapper.NodeWrapper
- XPathWrapper.NodeListWrapper
動作確認
設定変更後は、[デバッグ実行]にて、期待通りの動作をしているか動作確認を行ってください。
スクリプトエンジンを変更しただけの場合であっても、スクリプト(コード)の記述方法によっては動作が変わっている可能性がございます。動作が変わっている場合は、スクリプトの修正を行ってください。
コードの変更例
データ参照/更新の形式、XML 処理
文字型データ項目にセットされている次の XML を読み込んで、type=”リンゴ” の要素の price / quantity を出力するようなサンプルコードを記載します。
<sales vendor="John">
<merchandise type="Orange" price="4" quantity="6"/>
<merchandise type="Apple" price="3" quantity="10"/>
<merchandise type="Peach" price="5" quantity="3"/>
</sales>
変更前(Rhino 版):廃止されるデータ参照/更新の形式、E4X を利用
var type = "Apple";
var xmlText = data.get("2");
var xmlObj = new XML( xmlText );
var price = xmlObj.merchandise.(@type == type).@price;
var quantity = xmlObj.merchandise.(@type == type).@quantity;
var outStr = "type: " + type + "\n" +
"price: " + price + "\n" +
"quantity: " + quantity;
retVal.put("0", outStr);
変更後(GraalJS 版):フィールド名を利用したデータ参照/更新の形式、XPath 式を利用
const type = "Apple";
const xmlText = engine.findDataByVarName("q_xml_text");
const xpathType = "/sales/merchandise[@type='" + type + "']"
const node = xpath.findNode(xmlText, xpathType);
const price = xpath.findNodeText(node, "@price");
const quantity = xpath.findNodeText(node, "@quantity");
// 直接、テキストを取得
// const price = xpath.findNodeText(xmlText, "/sales/merchandise[@type='" + type + "']/@price");
// const quantity = xpath.findNodeText(xmlText, "/sales/merchandise[@type='Apple']/@quantity");
let outStr = "type: " + type + "\n" +
"price: " + price + "\n" +
"quantity: " + quantity;
engine.setDataByVarName("q_xpath_output", outStr);
データの型変換
Rhino では自動的な型変換が行われていたところも、GraalJS では明示的な型変換(キャスト)が必要となります。
例えば、HttpRequestWrapper の queryParam / formParam などにて(無意識に)数値を引数に指定しているところがあれば、GraalJS ではエラーとなるので修正が必要となります。
const limitNum = 1000;
httpClient.begin().queryParam("limit", limitNum); //変更前
↓
httpClient.begin().queryParam("limit", String(limitNum)); //変更後
◆ サービスタスク(Add-on) 〜サービスタスク定義(Addon-XML)〜
サービスタスク定義ファイル(Addon-XML)は、次のいずれかの箇所に登録されています。
- アプリ固有のサービスタスク定義
- (アプリ詳細画面) > ▼アプリ > アドオンの管理 > サービスタスク定義ファイル
- 対象アプリの「アプリ管理権限」が必要
- アプリ共有のサービスタスク定義
- システム設定 > アプリ共有アドオン > サービスタスク定義ファイル
- 「システム管理権限」が必要
登録されている Addon-XML ファイルにて、<engine-type> 要素の値が「0」(Rhino)、または要素自体が未定義(存在しない)の場合、対応が必要となります。
利用されているサービスタスク定義の内容に応じて、いくつかの対応方法がありますので、ご利用環境に合った方法をご検討ください。
a. 標準アイテム(モデリング要素)に置き換える
利用しているサービスタスク定義と同等の機能が標準アイテムとして提供されている場合、ワークフロー図にて標準アイテムに置き換えていただくのが良いです。
- 標準アイテム:R2010: モデリング要素の一覧
- 標準アイテムは、随時追加されております
- 以前はサービスタスク定義のアドオンとして公開されていたものが、標準アイテムとなったものもあります
b. 新しいサービスタスク定義に置き換える
利用しているサービスタスク定義の新版が公開されている場合、新しい Addon-XML ファイルをダウンロードし、既存のアドオンファイルを更新、もしくは別途登録後、ワークフロー図で置き換えてください。
- サービスタスク定義:自動処理工程を追加する(アドオン)
- 取得した Addon-XML ファイルにて、<engine-type> 要素の値が
「1」(Nashorn)または「2」(GraalJS)となっていることを確認ください - サービスタスク定義の動作仕様は変更となっている場合があります。目的に合致しているかどうかを確認ください。
- 既存のサービスタスク定義ファイルを更新した場合、稼働中のアプリの動作に影響を及ぼします
- 取得した Addon-XML ファイルにて、<engine-type> 要素の値が
c. サービスタスク定義(Addon-XML)を編集して更新する
自作のサービスタスク定義や、上記 a/b の方法で対応できない場合は、ユーザ自身で Addon-XML ファイルを編集し、更新してください。
- 関連ドキュメント:M416: 業務プロセス定義で利用可能な自動工程を自作する
スクリプトエンジンの変更
- <engine-type> 要素の値を「2」(GraalJS)
、または「1」(Nashorn)に変更- <engine-type>2</engine-type>
- <engine-type> 要素が未定義の場合は追加
スクリプト(コード)の変更
<script> 要素内のスクリプトにて、廃止される形式でのデータ参照/更新を行っている場合や E4X を利用した XML 処理を行っている場合は、コードの修正が必要となります。
対応方法については、「スクリプトタスク」セクション内の「スクリプト(コード)の変更」を参照してください。
お手数をお掛けし誠に恐縮ではございますが、スクリプトエンジン Rhino 廃止への準備・対応を進めていただきますよう、よろしくお願いします。