ここまでのレッスンをすべて終えると、ほとんどのコンポーネントを実装できるようになります。ただし、まだ説明していないワークフロー要素であるハンドラーがあります。
ハンドラーは 、(アクションと比較して) より複雑な論理モジュールをカプセル化します。ワークフローの実行中にバックグラウンドで実行され、特定のイベントをリッスンして処理し、独自のイベントを発行します。1 つのステップには、各タイプのハンドラーが 1 つしか存在できません。ハンドラーには ID がありません。
ハンドラーの数は少ないです。このレッスンでは、非常に頻繁に使用される 1 つのハンドラー ( value_extractor_handler
.
は value_extractor_handler
入力を検証し、入力から関連情報を抽出します。主にバーコードスキャンに使用され、場合によっては音声コマンドに使用されます。どのタイプの入力が有効かを制御し、入力のどの部分を変数に格納するかを定義する正規表現 (regex) を指定する必要があります。
次の例は、ハンドラー定義がどのようになるかを示しています。
<ステップ...> <handlers> <value_extractor_handler pattern="(?:(?:ADD|PLUS\s)(?:((\d{1,2})\sTIMES\s(\d{1,2}))|(\d{1,3})))|(\d{8,12})|(S([1-7])R([1-4]))|(B#[A-F0-9]{12})|(終了))"> <grp> <param name="grp_1" type="string">add_mutiplication</param> <param name="grp_2" type="string">add_factor_1</param>< param name="grp_3" type="string">add_factor_2</param>< param name="grp_4" type="string">add</param>< param name="grp_5" type="string">serialno</param> <param name="grp_6" type="string">location</param>< param name="grp_7" type="string">shelve</param>< param name="grp_8" type="string">rack</param> <param name="grp_9" type="string">code</param> <param name="grp_10" type="string">exit</param>< /grp>< /value_extractor_handler> </handlers>< /stepです>
正規表現に慣れている方なら、ここで新しいことは何もありません。を使用して ()
作成した各グループは、ステップ変数にキャプチャされます。「or」を表すために作成する必要があるグループは、 を使用して ?:
無視できます。正規表現を分解してみましょう。
(?:(?:ADD|PLUS\s)(?:( grp_1: 例: #{add_multiplication} == "10 Times 5" (\d{1,2})\sTIMES\s grp_2: 例: #{add_factor_1} == "10" (\d{1,2}))| grp_3: 例: #{add_factor_2} == "5" (\d{1,3})))| grp_4: 例: #{add} == "255" (\d{8,12})| grp_5: 例: #{serialno} == "123456789" (S grp_6: 例: #{location} == "S5R2" ([1-7])R grp_7: 例: #{shelve} == "5" ([1-4]))| grp_8: 例: #{rack} == "2" (B#[A-F0-9]{12})| grp_9: 例: #{code} == "B#ABCDEF123456 (EXIT)) grp10: #{exit} == "EXIT"
現在のステップでスキャンできるさまざまなコードタイプを定義しておきます。特定のタイプのコードがスキャンされるたびに、他のタイプの変数は未定義になります。たとえば、「PLUS 10 TIMES 5」をスキャンすると、グループ1〜3の変数にはコンテンツが含まれますが、残りは未定義になります。したがって、ルールでは、変数が存在するかどうかを確認する必要があります。ハンドラーの ドキュメント で、どのイベントが発行されるかを確認できます。以下に、処理のルール例をいくつか示します。
<onevent> <rule id="location_scanned"> <expression><![CDATA[ #{event(value_extractor):command} == 'VALID_EXTRACTION' &&exists(#{shelve}) && exists(#{rack}) ]]></expression> <actions>< setvar id="set_loction"> <context_of>workflow</context_of> <context_update>< param name="shelve" type="long">#{shelve}</param> <param name="rack" type="long">#{rack}</param> </context_update> </setvar> </actions> </rule> <rule id="invalid_input"> <expression><![CDATA[ #{event(value_extractor):command} == 'INVALID_EXTRACTION' ]]></expression> <actions> <ui_notification id="invalid_codeer" type="ERROR" duration="SHORT" show_immediately="true"> <message>"#{event:payload.code}" is not valid!</message> </ui_notification> </actions></rule>< /onevent>
外部バーコードスキャナーを利用できる場合は、時間をかけて試してみvalue_extractor_handler
る価値があります。