こんにちは、竹澤です。
ついにiPhone 7が発表されましたね!新色のJet Blackは今注文しても、納期が11月とか。ほとんどの人は現物はまだ見ていないと思うのですが、「現物を見ないでよく買うなー」と思います。まあ、どうせ2ヶ月ぐらい届かないので、現物見てNGだったら、キャンセルするのかもしれませんが。
さて、今日はSkyOnDemandで実行した連携処理を再実行するお話です。
次のようなシナリオを想定してみます。
・XYZ社は従業員10名のベンチャー企業である
・XYZ社では、基幹システムからSalesforceへ、取引先マスタを同期している(もちろんSkyOnDemandを利用)
・同期は毎朝9:00に行われる(1日1回)
・同期に失敗すると業務に支障がでるため、すぐに原因を確認して連携処理を再実行しなければならない
・ベンチャーなので、システム担当はあなた一人しかいない
これでは、あなたはおちおち休暇もとっていられません。
そんなあなたのために次のような仕組みを提案したいと思います。
(1) 連携の処理結果をSalesforceに自動登録する
(2) その結果をスマホで確認できる
(3) 再実行もスマホから実行できる
これで、どこからでも朝の業務が遂行可能です。では順に見ていきましょう。
(1) 連携の処理結果をSalesforceに自動登録する
SkyOnDemandには「Log Manager for Salesforce」という無償オプションがあります。
詳しくは過去のブログを参照いただきたいのですが、Salesforceに「Log Manager for Salesforce」というアプリをインストールすると、処理の結果をSalesforce上で見ることができるようになるものです。
ただし連携処理(SkyOnDemandのスクリプト)に、ログを出力するためのLog Managerのアイコンが3箇所(次の説明における①と③と④)必要になります。たとえば、スクリプトは次のような感じです。
簡単に説明すると、それぞれで次のような処理をしています。
① 連携処理の先頭に「開始」ログを出力する
② 連携処理の実体が書かれている、サブスクリプト
③ 正常終了時に「成功」ログを出力する
④ 異常終了時に「失敗」ログを出力する
(2) その結果をスマホで確認できる
(1)でインストールしたLog Manager for Salesforceは、デスクトップブラウザ向けのアプリなので、見た目はこのような画面になります。
これをスマホで見るのはイマイチなので、スマホ向けの画面を作ってみたいと思います。
そういった場合に便利なのが、弊社のSuPICEという製品(https://www.supice.com)です。
これは「先ほどの情報をSalesforce1アプリケーションで参照する画面」をSuPICEで作成しているところです。
① ツールパレットでここから画面に配置したい部品を選択します。
② 部品間の動き等を設定するところです。今回はリストから対象をクリックして、上記のスイッチをONにし、再実行ボタンを押すと再実行されるという動きを定義しています。
③ 配置した部品はここでプレビューをみたり、動作確認をすることができます。
③のところで簡単な動きの確認をして、OKそうであれば、右上にあるデプロイボタン(箱から矢印が出ているボタン)を押すとSalesforce上で実際に使えるようになります。
早速iPhoneで見てみましょう。こんな感じになります。一番下にあるとおり、9月14日に実行失敗したことが分かります。データのエラー内容をみて、担当者に修正を依頼するなどすることになると思います。
(3) 再実行もスマホから実行できる
上記の画面で再実行したい処理を選択し、画面上部のスイッチを右にスライドさせ、「再実行」ボタンを押したときに、再実行されるように設定します。
このためには、2つの設定が必要です。
・まずSkyOnDemand側でHTTPトリガーの設定を行います。HTTPトリガーについてはこちらのブログの「SkyOnDemandの連携処理を起動するためのインターフェース」の説明が詳しいです。
・次に、Salesforceの「プロセスビルダー」の機構を使って、前述のHTTPトリガーを呼び出す設定をします。
プロセスビルダーの設定はこんな感じです。真ん中あたりにある「ルール適用時のアクション」というところで、HTTPトリガーを呼び出すApexコードを実行しています。
また、肝心のApexコードは次のようになります。
public class LogManagerUtil { @InvocableMethod(label='Re-run Script' description='Re-runs script on SkyOnDemand') public static void reRun(List<ID> ids) { callSkyOnDemand(ids.get(0)); } @future(Callout=true) public static void callSkyOnDemand(Id targetId) { final String endpoint = 'https://www.skyondemand.net/ws/trigger/'; final String path = 'YOUR_HTTP_TRIGGER_PATH'; final String cid = 'YOUR_CID'; final String sid = 'YOUR_SID'; final String username = 'YOUR_USERNAME'; final String password = 'YOUR_PASSWORD'; HttpRequest req = new HttpRequest(); req.setEndpoint(endpoint + path + '?cid=' + cid + '&sid=' + sid); req.setMethod('POST'); Blob headerValue = Blob.valueOf(username + ':' + password); req.setHeader('Authorization', 'BASIC ' + EncodingUtil.base64Encode(headerValue)); req.setTimeout(60000); //60 seconds // 必要に応じて連携処理に渡すパラメータをセット req.setBody('param=XXX'); try { Http http = new Http(); http.send(req); } catch (CalloutException ce) { system.debug('CalloutException catched:' + ce); } } }
少し解説をしておきましょう。
L2は、プロセスビルダーから呼び出せるようにするためのお作法です。
L10-14は、SkyOnDemandから指定された(もしくはあなた自身で設定した)値をそのまま記述します。
L16-21は、Apexで外部サービスをHTTPで呼び出すためのコードです。SkyOnDemand側のBASIC認証に必要なコードも記述しています。
L23は、必要に応じて連携処理に引き渡すパラメータをセットします。
では実際にスマホから再実行してみましょう。こんな感じの画面になり、一番下のレコードを見ると、再実行されて結果は成功したことが分かります。
まとめ
いかがでしたでしょうか。
処理の実行結果を確認して、再実行するエッセンスを感じ取っていただけましたら幸いです。