タスクキューによるタスク実行
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/