2017.05.23

実行に失敗した連携処理を、スマホから再実行する

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

こんにちは、竹澤です。
ついに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は、必要に応じて連携処理に引き渡すパラメータをセットします。

では実際にスマホから再実行してみましょう。こんな感じの画面になり、一番下のレコードを見ると、再実行されて結果は成功したことが分かります。

まとめ

いかがでしたでしょうか。
処理の実行結果を確認して、再実行するエッセンスを感じ取っていただけましたら幸いです。




1 件

関連する記事