はじめに
転職して入った会社のITメンバーでアドベントカレンダーに参加するということで、
初めてQiitaに記事を投稿します!
転職してからOutsystemsでアプリ開発をしており、
開発を進める中で調べてもなかなか答えにたどり着けなかったことをシェア出来ればと思います。
今回は、Outsystemsで非同期処理を実装する方法について紹介します。
自己紹介
初めて投稿するので、自己紹介しておきます。
以前は30名程度のSIerで様々なプロジェクトに常駐するSEとして7年ほど働いていました。
その頃はJavaやC#で開発をしたり、要件定義や設計などの上流工程もやったりしていました。
そこから外資系の人材会社に転職し社内SEとなりました。
現在は社内の業務効率化のためのアプリなどを主にOutsystemsで開発しています。
目次
- 非同期処理とは
- クライアント処理での実装方法
- サーバ処理での実装方法
非同期処理とは
そもそも非同期処理とは? という方のために説明します。
と思ったのですが、説明してくれてる記事があったのでこちらを参考にしてください。
https://qiita.com/kiyodori/items/da434d169755cbb20447
例えば、Webページでボタン押したときに画面ぐるぐるの時間が長いと
ユーザビリティが低くてよろしくないので、
処理結果を待つ必要がない処理は非同期で動かそうよってことですね!
JavaだとThreadを継承したクラスやRunnableを実装したクラスをnewして
startメソッド呼び出せば実現する感じですが、
Outsystemsだとどう実現するかがなかなか見つからなかったので、シェアしたいなと思いました。
では、本題行きます!
クライアント処理での実装方法
クライアント処理では、Javascript の setTimeout が使えます。
例えばこんな感じ。
上の画像はなにをしているかというと、
スマホやタブレットのバッテリーの状態をみて、残りが少ないとアラートメールを送信する
NotifyBatteryStatusというクライアントアクションを作っており、
それをsetTimeoutで呼び出しています。
setTimeout($actions.NotifyBatteryStatus($parameters.Level, $parameters.IsPlugged), 0);
setTimeoutの第1引数が非同期で処理させたいアクション(引数付き)で、
第2引数が何ミリ秒後に実行するかです。今回は即実行させたいので0にしてます。
メール送信はサーバアクションを呼ぶしかないので、ネットワークを介する分処理に時間がかかりますが
その処理結果を見る必要がなかったので、
メールを送るか判定する部分も含めて非同期で実行するようにしています。
というわけでクライアント処理で非同期させたかったら、setTimeout使えます!
これはJavascript経験者ならすぐ出てきそうですね。
サーバ処理での実装方法
さて、クライアント処理はJavascript使えば行けるっていうのはすぐたどり着けるのですが、
サーバ処理での実現方法はOutsystems特有で、調査に時間かかりました。
で、結論から言うと2つのやり方があります!
- Timer
- Process
Timerを使った非同期処理(引数指定不可)
Timerってスケジュール起動か手動実行するバッチ処理だよね?って感じですよね。
そのTimerをサーバアクションから呼べるんです。
こんな感じで、
Timerの下にあるWake~をサーバアクション内にドラッグ&ドロップすればTimer処理が呼べちゃいます。
で、それは実行しているサーバアクションとは非同期で動いてくれるんです。
Wake~を呼んだら即実行されるわけではなくて、数秒たってから実行されます。
ただ、Timerでの非同期処理の難点としては、パラメータが渡せないところです。
それを解決してくれるのが次です。
Processを使った非同期処理(引数指定可能)
Processって使ったことありますか?私はなかったです。。
こんな使い方ができるんだなって感じでした。
ProcessのLaunch~をサーバアクションから呼び出せて、引数も指定できます。
Entityは無理ですが、TextやIntegerなどのBasicTypeと、EntityIdentifierが引数として使えます。
なのでEntityIdentifierを引数に渡して、
Process内でEntityからデータを取得して処理するっていうのはできますね。
最後に
というわけで、Outsystemsでの非同期処理の実装方法を紹介しました。
昨今SaasがいろんなAPIを公開してたりしますが、それをRESTやSOAPで呼び出すときに時間がかかるので、
そういった処理を非同期で呼ぶようにするなんてこともよくあるかなと思いますので、
ぜひ参考にしていただけると嬉しいです!