Translate

2012年3月1日木曜日

Google App EngineでRecipients Emailed が100を超えた時の動作

ずっとほおっておいた
Google App Engine で構築したサイトが
うごいていないといわれ、
コンソールを見たら
以下のような状態になっていた。



Recipients Emailed は
1日MAX100件
1分間でMAX8件
処理したときに使用出来なくなる。

..ただ
どうしようできなくなるのか
よくわからなかったのだけど、
発生させて初めて気づいた。

制限を超えると該当のAPIのコール
がよべなくなるのだ。

実は作っていたのは
性格判断テストサイトのようなもので
最後の判定結果が表示されたときに
結果を所定のgmailアドレスへメールで飛ばす
機能のため、
以下のようなクラスをつくってうごかしていた。



import java.io.UnsupportedEncodingException;
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;


public class MailStoreManager {
 private static MailStoreManager manager = new MailStoreManager();
 private boolean store = false;
 private String address = null;
 private MailStoreManager(){
   String doStore = System.getProperty("mail.send");
   doStore = doStore.trim().toLowerCase();
   if("true".equals(doStore)){
     store = true;
   }else{
     store = false;
   }
   address = System.getProperty("mail.to");
   if(address==null) store = false;
   else store = true;
 }
 public static synchronized MailStoreManager getInstance(){
   return manager;
 }

 public void doStore(String msg) throws UnsupportedEncodingException, MessagingException{
   if(!store) return;
   Session session = Session.getDefaultInstance(new Properties());
   MimeMessage message = new MimeMessage(session);
   message.addRecipient(
       RecipientType.TO,
       new InternetAddress(
           address,
           "John Doe",
           "ISO-2022-JP"));
   message.setSubject(
       "[TEST] " + Utils.now());
   message.setText(
       msg,
       "ISO-2022-JP");
   message.setFrom(
       new InternetAddress(
           "gae_admin@gmail.com",
           "John Doe site",
           "ISO-2022-JP"));
   Transport.send(message);
   return;
 }
}


あまり考えも無しに
Singletonで作って
メール機能停止用のプロパティmail.sendを
false(true以外)にすると
メールが飛ばなくなるようにと
つくったつもりだった。

Singletonだから
コンストラクタでプロパティ処理と一緒にAPIよんでたっけと
調べてみてもはいっていない。

どうも
importする事自体ダメになっているらしい..

こまかく調べきれないけど
おそらくクラスロードも許してくれないらしい

..それくらい、いいじゃんか..


で修正だけど、
まあ例外発生させcatchで云々も考えたけど
今後制約がどうにかなるかもしれないので
メール送信は諦めてBigTableへ格納する
ように作り替えてしまった。
Google Docsのフォームに放り込むことも考えたけど
それだったらApp Engineでフロント書かないほうがいいだろうし。


..にしても、
..こんなの実際にエラーにしないと
どう実装すればわからんじゃん..

ほかにも制約はいろいろあるわけで
それらに引っかかったらどうなるかよくわかってないと
商売のサイトにはちょっと使うのは怖い..

..App Engine、体で覚えろってことなのか..



p.s.
もちろんお金で解決する
という方法もあります;-p



billing を enable にすれば1日5100件送れるらしいです。

0 件のコメント:

既存の複数のEC2インスタンスを毎週月~金の8:58から18:02まで起動させておくCloud Formation定義ファイル

トライアンドエラーを繰り返し表題の定義ファイルをつくった。 ようやく動作したので、グログにのこしておく。    忘備録として:   AWS EventBridgeを使っている(Lambdaでやる方法もある) イベントバスはdefaultでないとスケジュール化できなかった パラメー...