今回は、
Google App Engine for Java で
PubSubHubbub を利用する話。
Japanese Bloggers Info、1 月に公開してから、現在の登録ブログ数が 250 近く。まだまだブログ数は伸びそうだけど、すでに CPU Time が 60% ぐらいになってしまっているので、なんとかしなくちゃと思っているところ。
ブログ更新の確認のために、cron と TaskQueue で、5 分ごとに全ブログのフィードにアクセスさせているのだけど、そこがやはり最も CPU を使っている部分。
ポーリングをやめていっそのこと PubSubHubbub にしてみたらどうだろう?と思って調べてみた。Blogger は Publisher として PubSubHubbub に
対応しているので、こちらで Subscriber を用意すればいいというわけ。参考にしたのは、PubSubHubbub の仕様
と、実際の Hub。今ごろ気づいたけれど、これも GAE で動いてるんだ…。
この
http://pubsubhubbub.appspot.com/subscribe
という URL に、GAE アプリケーションから POST で Subscription Request を送る(パラメータは
こちらを確認)と、hub.callback パラメータで送った Subscriber の更新通知用の URL に、折り返し確認の GET アクセスが来る。受け取ったアクセスのパラメータを確認(
こちらを参考に)したら、そのまま hub.challenge の内容を本文にして、200 番台のステータスコードで返してやると、Hub への Subscribe 登録が成功。
最初の購読希望の POST アクセスは、Hub のデバッグページ(というか、ここが実際の Subscription Request の送り先…)
から、フォームで送信できるので、色々テストしてみるのがよさそう。
購読登録が終了したフィードに更新があると、自動的にその更新部分のみを Atom フィードにして、POST で Subscriber の更新通知用の URL に送りつけてくれる。受け取ったという印に 200 番台のステータスコードを返せとのことだが、202 Accepted だと認識されず、5 回までリトライ、Failure のまま終了してしまった。200 OK を返してみると 1 回で認識。実際の Subscription 失敗の詳細は、前掲のデバッグページ「Subscriber Diagnostics」から確認できる。
更新情報の Atom フィードは POST の本文として送られてくるので、
Feed feed = new Feed();
try {
feed.parseAtom(new ExtensionProfile(), req.getInputStream());
} catch (ParseException e) {
e.printStackTrace(System.err);
}
という形で Feed にパースできる。後は
Entry entry = feed.getEntries().get(0);
String title = entry.getTitle().getPlainText();
String content = entry.getTextContent().getContent().getPlainText();
なり、なんなりと。
ということで、これはなかなか使えそうな予感。とはいえ、なかなかまとまった時間が作れないので、いつこれを組み込めることやら…ううむ。