ご無沙汰してましたm(_ _)m
先月1児のパパになったシステム部の佐々木です。
本日はGoogle App EngineのCronサービスとメール配信についてつらつらと書いていきたいと思います。
Unix/Linuxをご存じの方には説明不要かと思われますが、そうです。あのCronです。
データベースの定期監視を行う場合など、非クラウド環境のJavaアプリケーションでは非同期スレッドを生成してsleepしながらデータベースを監視するというのが定石だったかと思いますが、GAEではそもそもスレッドの生成ができません。
これの代わりにGoogle App EngineではCronサービスを使用します。
それではCronサービスを使用して、定期的にメールを送信する方法を説明していきます。
1.ジョブの作成
まずは定時実行されるジョブを作ります。とはいっても作るのは単なるサーブレットです。
Google App EngineのCronサービスはURLに対してHttpGETリクエストを放ることでジョブの実行を行っているので「ジョブ=サーブレット」ということになります。
Pureサーブレットでもよいのですが、筆者がSlim3を使用しているので、build.xmlの”gen-controller-without-view”からコントローラを生成します。
ここではURL”/cron/cronTest”としてCronTestController.javaを生成しました。
package com.sample.controller.cron;
import java.util.Date; import java.util.Enumeration; import java.util.logging.Logger; import org.slim3.controller.Controller; import org.slim3.controller.Navigation; import com.google.appengine.api.mail.MailService; import com.google.appengine.api.mail.MailServiceFactory; import com.google.appengine.api.mail.MailService.Message; public class CronTestController extends Controller { @Override public Navigation run() throws Exception { // MailService MailService service = MailServiceFactory.getMailService(); // Message Message message = new Message(); // 送信者は必ずアプリケーション管理者 message.setSender("rl.ysasaki@gmail.com"); // to message.setTo("y-sasaki@r-learning.co.jp"); // タイトル message.setSubject("Cronテスト"); // 本文 message.setTextBody("メール送信テスト:" + new Date().toString()); // 送信 service.send(message); return null; } }
処理中では低レベルのメールAPIを使用してメール送信を行っています。
ネット上で公開されているサンプルはjavax.mailを使用したサンプルが多いですが、低レベルAPIの方が簡単なのでこっちで書いてます。
http://code.google.com/intl/ja/appengine/docs/java/javadoc/com/google/appengine/api/mail/package-summary.html
2.ジョブのテスト
まずは作ったジョブが動くかどうかですね。メール送信はローカルでは確認できないのでGoogle App Engineにアプリケーションをデプロイします。
デプロイ後、ブラウザからhttp://アプリケーションホスト/cron/cronTestにアクセスし、メールが送信されればテストは完了・・・・・
とはいかないのです。
このままでは一般ユーザがURLにアクセスした場合に、不正なジョブの実行になってしまいます。
これを回避するために、adminユーザ以外のアクセスを禁止する必要があります。
一般ユーザのアクセスを禁止するにはwar/WEB-INF/web.xmlに以下の記述を追加します。
<security-constraint> <web-resource-collection> <url-pattern>/cron/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint>
これで管理者以外は”/cron/*”のURLにアクセスできなくなりました。
3.ジョブの登録
ジョブの登録はwar/WEB-INF/cron.xmlに以下の内容を記述し、デプロイしたら完了です。
<?xml version="1.0" encoding="UTF-8"?> <cronentries> <cron> <url>/cron/cronTest</url> <description>CronTest And MailService</description> <schedule>every 1 minutes</schedule> <timezone>Asia/Tokyo</timezone> </cron> </cronentries>
- url・・・実行するジョブのURL
- schedule・・・ジョブの起動タイミング(例は毎分)
- timezone・・・デフォルトはUTCなので日本時間でジョブ実行する場合は”Asia/Tokyo”を指定
Scheduleの書き方
http://code.google.com/intl/ja/appengine/docs/java/config/cron.html#The_Schedule_Format
Timezone
http://en.wikipedia.org/wiki/List_of_zoneinfo_time_zones
4.ジョブの解除
cron.xmlの<cron>要素を消してデプロイし直せばジョブは解除されます。
また、Google App Engineの管理コンソールから、登録されているCronの状態(Cron Jobs)を確認することもできます。
次回はTaskQueueについて書きます。



