GAEで遊ぶ2

進捗が著しく悪い・・・・。とりあえず、嵌った所をメモ書き。

  • ezmorphが動いた(解決)
    • ソースを直すことになりましたが、非常に簡単でした。
    • 後述のロジックでエラー。Locale.setDefault( Locale.US );無視しても大丈夫そうなので、適当にエラーハンドリングを追加。
    • 恐れていたリフレクション関連の制約ではなかったぽく一安心。リフレクションの制約はprivate系へのアクセスがいけないらしい・・・
  • JDOでパフォーマンスがでない(解決?回避?)
    • ローカルだとさくさく動く
    • サーバにもっていくとすごい遅さになり、com.google.apphosting.api.DeadlineExceededException,com.google.apphosting.runtime.HardDeadlineExceededErrorが出る。やな名前だ。
    • やってる処理内容は下記のクラスのパーシスタンス
//はてなブックマークエントリー情報取得API
//で取得できるjsonをbean化したもの
public class BookMarkInfo implements Serializable{

	@PrimaryKey
	public String url;
	@Persistent
	public String title;
	@Persistent
	public int count;
	@Persistent
	public String entryUrl;
	@Persistent
	public String screenshot;
	@Persistent
	public String eid;
	@Persistent
	public Date updateDate;

	/**
	 * 一人、一人のブックマークを現すデータ。
	 * 要素数はbookMark数と同じエントリ数に・・・・
	 */
	@Persistent	
	 public List<BookMarkDetailOneUserInfo> bookmarks = new
	 ArrayList<BookMarkDetailOneUserInfo>();

        //・・・・省略
    • ってことで、insertを1000発単位で投げているようなものになりかねないので、ある意味しょうがない。が、このままでは使い物にならないので修正。
public class BookMarkInfo4JDO implements Serializable {

	@PrimaryKey
	public String url;
	@Persistent
	public String title;
	@Persistent
	public int count;
	@Persistent
	public String entryUrl;
	@Persistent
	public String screenshot;
	@Persistent
	public String eid;
	@Persistent
	public Date updateDate;
	
	//★ここを修正
	@Persistent(serialized = "true")
	public UserBookMarks userBookMarks=new UserBookMarks();

	//ブックマークの詳細を個別に見ることはないので、
	//ひとつのクラスにまとめてシリアライズ
	class UserBookMarks implements Serializable{
		private static final long serialVersionUID = 1L;
		public List<BookMarkDetailOneUserInfo> bookmarks = new
		 ArrayList<BookMarkDetailOneUserInfo>();
	}

	//本当は、下記の感じでいければよかったのだが、
	//java.lang.ClassCastException:com.google.appengine.api.datastore.Blob 
	//cannot be cast to java.util.Collection
	//としかられて断念。
	//@Persistent(serialized = "true")
	//@Persistent(serialized = "true",defaultFetchGroup = "true")
	//@Persistent(serializedElement = "true") も駄目だった気がする
 	//public List<BookMarkDetailOneUserInfo> bookmarks = new
	//ArrayList<BookMarkDetailOneUserInfo>();

        //・・・・省略
}
    • サイト主の使い方が悪いのか、こういうものなのか不明。@EmbeddedOnlyとか色々アノテーションはあるので、何とかできてほしいが、、、


感想


やっぱり、落とし穴が多く、片っ端からずぶずぶはまる印象(あまりドキュメントを読まないせいもある)。とくに、CPUを限界まで使い切るアプリを作ろうと思った場合、タスクの分割粒度が問題になりそうだ(ローカルとサーバで負荷のかかり方が異なるので読みが外れる)。また、タスクの平行実行も考える必要がありそうだ(JDOのトランザクションが出てくるのであまりやりたくない)。