GAE + GWT プログラミングメモ

Google App Engine とGoogle Web Toolkit のメモ

タスクキューによるタスク実行

GAEは一つの処理を30秒以内に終わらせなければならないため、時間のかかる処理はタスクキューを使って分割実行する必要がある。

キューの登録はWEB-INF以下にqueue.xmlを作って登録する。
rateは追加されたキューの実行間隔。
1/sであれば、1秒に1回のペースで未実行のキューを実行する。

<queue-entries>
  <queue>
    <name>queueServlet</name>
    <rate>1/s</rate>
  </queue>
</queue-entries>

キューの追加はQueueFactory.getQueue("queueServlet")で作成したqueueに対し、addする。
TaskOptions.Builder.withUrlで、URLを指定することができるが、指定しない場合は、/_ah/queue/queueServletというURLが使われる。
TaskOptions.Builder.withParamでパラメータを指定することができる。

Queue queue = QueueFactory.getQueue("queueServlet");
for (int i = 0; i < 10; i++) {
  queue.add(TaskOptions.Builder.withParam("count", Integer.toString(i)));
}

指定したパラメータはHttpServletRequestのgetParameterで取り出せる。

public class QueueServlet extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		Logger logger = Logger.getLogger(QueueServlet.class.getName());
		logger.info("count is " + req.getParameter("count"));
	}
}

QueueServletはweb.xmlに/_ah/queue/queueServletで登録すればよい。

  <servlet>
    <servlet-name>queueServlet</servlet-name>
    <servlet-class>com.kumoniji.server.QueueServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>queueServlet</servlet-name>
    <url-pattern>/_ah/queue/queueServlet</url-pattern>
  </servlet-mapping>

上の結果は以下のようになる。
1秒間隔で実行されているようには見えず、順番もばらばらな理由はよくわからない。
ともかく、順番に依存する処理は入れないほうが無難。

情報: count is 4
情報: count is 0
情報: count is 5
情報: count is 8
情報: count is 6
情報: count is 9
情報: count is 3
情報: count is 1
情報: count is 7
情報: count is 2


作成中のアニメ特化アンテナサイト
http://kumo2ji.appspot.com/