みなさんこんにちは。
Salesforceお助け隊の西槇です。
Apexクラスで開発したバッチ処理をセールスフォース上で定期的に実行するには、
Apexスケジューラーを使用することになるかと思います。
先日行った案件では、もっと短い間隔でバッチ処理を実行する必要がありました。
セールスフォースでは、常に常駐し続けるようなデーモンプログラムの開発はできないため、
定期的に実行する処理を行う必要があります。
今回私が用いた方法は、セールスフォースのサイトの機能と、
外部でレンタルしているサーバ内のスケジューラ機能(Cron)を組み合わせて実現しました。
【手順】
1)Visualforceページを作成する。
作成するVisualforceページは以下のような仕組みにします。
■apex:pageタグ
・controllerに、Apexクラス名を指定する。
・Actionに、Apexクラスのメソッド名を指定する。
※Apexクラスのコンストラクタでバッチ実行しようとしてしまうと、データ更新を行う処理があると
エラーになりますので、Actionにメソッド名を指定してください。
詳しくは【Apex】コントローラクラス(Apexクラス)のコンストラクタでは、DMLの実行はできない。をご覧ください。
ページで表示する内容は、処理が正常に終了したかどうかをレスポンスコードを
表示するような仕組みにすると良いでしょう。
2)サイトの設定を行う。
どこからでもバッチが実行できてしまうと、攻撃されてしまう恐れがありますので、
サイトに接続できる、接続元IPアドレスを絞ります。
サイト->公開アクセス設定->ログイン IP アドレスの制限 を開き、レンタルサーバのゲートウェイIPアドレスを指定します。
3)レンタルサーバ側でシェルスクリプトを作成する。
Salesforceのサイトにアクセスさえしてくれればよいので、とても簡単なスクリプトで済みます。
最低限でよければ、以下のようなコードだけあれば良いでしょう。
「wget --delete-after {サイトURL}」
シェルスクリプトが正しく実行されるか、レスポンスコードが正しく帰ってくるかを
手動で実行して確かめてください。
4)Cronの設定を行う。
レンタルサーバ側でシェルスクリプトを定期的に実行するために、
Cronの設定を行います。
レンタルサーバによっては、Cronに設定できるのは、perlもしくはphpに限られていることもあります。
そのような場合には、3)で作成するスクリプトを、対応するプログラム言語で
作成する必要があります。
【応用編】
1)で作成するVisualforceページで、レスポンスコードをXML形式で表示するようにし、
3)のスクリプトで、XMLを外部サイトから読み取るような仕組みにすれば、
処理に失敗した場合に、アラートメールを送信するようなこともできます。
「セールスフォースお助け隊ブログ」へのコメントやご意見等ありましたら
ファンページまでお願いします。 Facebookのファンページ