2023-05-26:公開
2023-08-14:Ver. 15.1 / Ver. 16.0 での対応内容、記事タイトルを変更
(今後「GraalJS (Nashorn Compatible Mode)」廃止に関する情報があれば、本記事を更新します。)
Questetra には、ユーザ自身がスクリプト(ECMAScript)を記述してオリジナル処理を定義できる自動処理工程[スクリプトタスク]と、インポートして追加することのできるアドオン自動工程[サービスタスク(Add-on)]があります(Professional で利用可能)。
(アドオン自動工程には、公開されているサービスタスク定義(Addon-XML)やユーザ自身が自作したものがあります。)
2023年5月現在、[スクリプトタスク][サービスタスク(Add-on)]では、スクリプトエンジンとして「GraalJS (Nashorn Compatible Mode)」(旧名称:「GraalJS」)を利用することができますが、2024年4月アップデート予定の Ver. 16.0 にて廃止される予定ですのでお知らせいたします。
つきましては、[スクリプトタスク][サービスタスク(Add-on)]にて、スクリプトエンジンに「GraalJS (Nashorn Compatible Mode)」が利用されている場合は、2024年3月31日までに「GraalJS (Standard Mode)」を利用するよう対応をお願いいたします。
スクリプトエンジンとは
GraalJS をはじめ、過去に採用されていた Rhino / Nashorn などは、JavaScript の実行エンジン(スクリプトエンジン)で「Java で実装された機能にアクセスできる」ことが大きな特徴です。この特徴を利用して、[スクリプトタスク]等では、Java で実装された Questetra(のワークフローエンジン)に JavaScript の文法を借りてアクセスすることができるようになっております。
スクリプトの文法は JavaScript(EcmaScript)の仕様に準拠していますが、「Java で実装された機能にアクセスできる」部分は、スクリプトエンジンによって仕様が異なります。そのため、スクリプトエンジンの変更に伴い、スクリプトの適応保守が必要となります。
◆ GraalJS (Nashorn Compatible Mode) 廃止までの経緯と対応予定
スクリプトエンジンは、Java バージョンや技術の変化に応じ、最適なものが変遷してきております。Questetra でも、過去に Rhino / Nashorn というスクリプトエンジンが採用されておりましたが、それぞれ2021年6月、2022年4月に廃止されました。
Questetra で GraalJS が導入された際は、Nashorn からの移行と互換性を考慮し GraalJS の動作モードとして「Nashorn Compatible Mode」が採用されました。その後 Nashorn は廃止されたため、「Nashorn Compatible Mode」である必要性がなくなりました。
2023年4月の Ver. 15.0 では、スクリプトエンジンに「GraalJS (Standard Mode)」が新たに追加され(デフォルト設定)、「GraalJS (Nashorn Compatible Mode)」は廃止予定となりました。
今後、「GraalJS (Nashorn Compatible Mode)」が完全に廃止されるまでの予定は次の通りとなっております。
- 2023年8月(予定: Ver. 15.1)
- (Ver. 15.1 アップデート時にアプリ定義エラーとなる対応は取り止め、[プロセスログ]に警告を出力する対応を追加)
- プロセス実行時に「GraalJS (Nashorn Compatible Mode)」が利用された場合、[プロセスログ]に警告メッセージが記録されるように対応
ワークフローアプリにて「GraalJS (Nashorn Compatible Mode) 」が利用されている工程がある場合、アプリ定義エラーとなりますアプリの新バージョンを[リリース]する場合、アプリ定義エラーを解消いただく必要があります
プロセス実行(ワークフローアプリの処理)時にはエラーとはなりません既に稼働中のワークフローアプリでは、スクリプトエンジン「GraalJS (Nashorn Compatible Mode)」にて処理が実行されます
- 2024年4月(予定: Ver. 16.0)
- スクリプトエンジン「GraalJS (Nashorn Compatible Mode)」が完全に廃止されます
- スクリプトタスク
- Ver. 16.0 へのアップデート時に「GraalJS (Nashorn Compatible Mode)」が強制的に「GraalJS (Standard Mode)」に変更されます
- コード内容によっては、処理結果が変わったり、「処理失敗(エラー)」となる可能性があります
- サービスタスク(Add-on)
- [スクリプトタスク]と同様、スクリプトエンジンが強制的に変更されます
スクリプトエンジン(<engine-type>)の変更は行われませんプロセス実行時に対象の工程は「処理失敗」となります
◆ スクリプトタスク
[スクリプトタスク]を利用している場合、「スクリプトエンジン」の変更と、必要に応じてスクリプト(コード)の変更が必要です。設定変更後は、動作確認を行い、問題なければ新バージョンを[リリース]してください。
◆◆ スクリプトエンジンの変更
- 「GraalJS (Nashorn Compatible Mode)」から「GraalJS (Standard Mode)」へ変更
◆◆ スクリプト(コード)の変更
多くの場合、GraalJS (Nashorn Compatible Mode) で動作していたスクリプトは、GraalJS (Standard Mode) でも同じように動作します。
ただ、次の2点については、変更対応が必要となります。
- String オブジェクトについて、java.lang.String のメソッドが利用されている場合
- 例:String#equals() メソッド、など
- Java オブジェクトへのアクセスで、仕様に記載されていない方法でアクセスしている場合
- 例:Error#message プロパティ、ItemView#value プロパティ、ItemView#display プロパティ、など
参考)
Nashorn Compatible Mode
https://github.com/oracle/graaljs/blob/master/docs/user/NashornMigrationGuide.md
コードの変更例
java.lang.String 由来のメソッド
String クラスが JavaScript String への対応を進める方向性のため、java.lang.String に由来するメソッドは利用しないようにしてください。
const orgName = engine.findDataByVarName("q_org").getName(); //組織名
if(orgName.equals("営業部")){ //変更前
...
}
↓
if(orgName === "営業部"){ //変更後
...
}
Java クラスの仕様に記載されていないプロパティ
com.questetra.bpms.core.event.scripttask.ItemView クラスでは、getValue() / getDisplay() メソッドは定義されていますが、value / display プロパティは定義されていません。しかし、GraalJS (Nashorn Compatible Mode) では、item.value / item.display で選択肢ID / 表示ラベルの値を取得することができておりました。
const item = engine.findDataByVarName("q_select_radio"); //選択型
let itemStr = "";
itemStr = "選択肢ID:" + item.value + "、表示ラベル:" + item.display; //変更前
↓
itemStr = "選択肢ID:" + item.getValue() + "、表示ラベル:" + item.getDisplay(); //変更後
同様に Java の例外オブジェクト(の実体である java.lang.Throwable)には message プロパティはありません。
Java オブジェクトの処理でスローされた例外は、Java の例外オブジェクトになります。Java の例外オブジェクトを処理する場合、message プロパティにアクセスしないでください。例えば toString() メソッドを利用するように変更してください。(toString() メソッドは、JavaScript の Error オブジェクトでも定義されています。Javascript の Error オブジェクト/ Java の例外オブジェクト、区別なく同じように処理することができます。)
try{
//Java オブジェクトの処理
}catch(e){
engine.log(e.message); //変更前
...
}
↓
}catch(e){
engine.log(e.toString()); //変更後
...
}
◆◆ 動作確認
設定変更後は、[デバッグ実行]や[この工程のみデバッグ]を利用して、期待通りの動作をしているか動作確認を行ってください。処理結果が変わっていたり、エラーとなっていたりする場合は、スクリプトの修正を行ってください。
- 関連ドキュメント
◆ サービスタスク(Add-on) 〜サービスタスク定義(Addon-XML)〜
アドオン自動工程を追加するサービスタスク定義ファイル(Addon-XML)は、次のいずれかの箇所に登録されています。
- アプリ固有のサービスタスク定義
- (アプリ詳細画面) > ▼アプリ > アドオンの管理 > サービスタスク定義ファイル
- 対象アプリの「アプリ管理権限」が必要
- アプリ共有のサービスタスク定義
- システム設定 > アプリ共有アドオン > サービスタスク定義ファイル
- 「システム管理権限」が必要
登録されている Addon-XML ファイルにて、<engine-type> 要素の値が「2」(GraalJS (Nashorn Compatible Mode))の場合、対応が必要となります。
利用されているサービスタスク定義の内容に応じて、いくつかの対応方法がありますので、ご利用環境に合った方法をご検討ください。
a. ビルトイン自動工程(モデリング要素)に置き換える
利用しているサービスタスク定義と同等の機能がビルトイン自動工程として提供されている場合、ワークフロー図にてビルトイン自動工程に置き換えていただくことを推奨します。
- R2010: モデリング要素の一覧
- ビルトイン自動工程は、随時追加されております
- 以前はアドオン自動工程としてサービスタスク定義が公開されていたものが、ビルトイン自動工程となったものもあります
b. 新しいサービスタスク定義に置き換える
一部のサービスタスク定義では、GraalJS (Standard Mode) 対応版(<engine-type> 要素の値が「3」)をダウンロードできるものがあります。利用しているサービスタスク定義で対応版が入手可能な場合、新しい Addon-XML ファイルをダウンロードし、既存のアドオンファイルを更新、もしくは別途登録後、ワークフロー図で置き換えてください。
- サービスタスク定義:自動処理工程を追加する(アドオン)
- 取得した Addon-XML ファイルにて、<engine-type> 要素の値が「3」(GraalJS (Standard Mode))となっていることを確認ください
- サービスタスク定義の動作仕様は変更となっている場合があります。目的に合致しているかどうかを確認ください。
- 既存のサービスタスク定義ファイルを更新した場合、稼働中のアプリの動作に影響を及ぼします
- GraalJS (Standard Mode) 対応の Addon-XML のサンプルが提供されるのは一部のサービスタスク定義のみとなります
c. サービスタスク定義(Addon-XML)を編集して更新する
自作のサービスタスク定義や、上記 a/b の方法で対応できない場合は、ユーザ自身で Addon-XML ファイルを編集し、更新してください。
- 関連ドキュメント
スクリプトエンジンの変更
- <engine-type> 要素の値を「3」(GraalJS (Standard Mode))に変更
<engine-type>3</engine-type>
スクリプト(コード)の変更
対応方法については、「スクリプトタスク」セクション内の「スクリプト(コード)の変更」を参照してください。
<last-modified> の変更
(最終更新日)が指定されている場合、値を新しいものに書き換えてください - 最終更新日が既に登録されている Addon-XML での値より新しくない場合、アドオンの更新登録時にバリデーションエラーとなります
お手数をお掛けし誠に恐縮ではございますが、スクリプトエンジン GraalJS (Nashorn Compatible Mode) 廃止への準備・対応を進めていただきますよう、よろしくお願いします。