Goodpic.com
2003年09月09日

weblogの更新通知 PingサービスをJava Servletで実装

weblogs.comのようなPingサービスの面白い点は、そのリアルタイム性にあります。WEBの検索だとGoogleのようなサーチエンジンがありますが、Googleは検索ロボット(WEB Spider)で収集したリンク情報を元にインデックスを作成、DB化したものを、独自のアルゴリズムを基に重み付け(Page Rank)してキーワードに対する検索結果を表示します。
ただし情報収集は能動的にWEB Spiderを、インターネット上に徘徊(Crawl)させることで行うので、どうしてもタイムラグが発生します。サイトの更新日付をチェックすることで、サイトをCrawlする頻度を動的に制御したり、ニュースサイトに限定してリアルタイム性を重視する検索サービスなども提供していますが、一方でPingサービスを利用すると、複雑なアルゴリズム無しに、例えば「最近6時間でブログで話題になったテーマ、本」などを簡単にサーチすることが可能です。
このようなアプローチは、MovableTypeやBloggers.comのようなツールが普及して、Ping処理を自動的に行ってくれることで、始めて現実的に普及してきたアイデアだと思います。weblogs.comなどのブログ更新通知サービスについて以前に書きましたが、
- blogのアップデート通知サービス
- weblogs.comを利用したサービス
これから益々セマンティックなMetaデーターがEntry内に記述されるようになると、結構面白くなってくるのではないでしょうか。Ping情報を、国や位置情報、エントリーの内容カテゴリなどでソートできると、グローバルかつリアルタイムに情報を参照できる”グローバル・ブレイン”になりますから、そこからどのように情報を見せるか、という点も重要な気がします。。


では具体的にPingの実装がどうなっているかという点ですが、Naoyaさんのブログで素晴らしい解説をされていたので、まずはこちらを参照
- Weblogs.Com Ping の Perl による実装
- Weblogs.Com changes.xml を Perl で料理する一例
- Weblogs.Com changes.xml を吐いたりする Ping サーバの Perl 実装

ただ最近Perlを忘れ気味なので、JavaでためしにPing Serverを実装してみました。JavaでもApacheのXML-RPCモジュールがあって、実装は結構簡単です。
例えば、PingRecieverというPingを受け付けるServletを作るとして、以下のようにorg.apache.xmlrpc.XmlRpcServerのインスタンスに新しいHandlerとして、PingのHandlerであるweblogUpdatesを追加、それに対応するHandler内に処理を実装します。(この例では特に処理は何もしませんが)

■ Pingを受け付けるServlet

public class PingReciever extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response){
XmlRpc.setEncoding("UTF-8");
XmlRpcServer xmlrpc = new XmlRpcServer();

xmlrpc.addHandler ("weblogUpdates", new UpdateHandler(xml_file));
try {
byte[] result = xmlrpc.execute (request.getInputStream());
response.setContentType ("text/html");
response.setContentLength (result.length);
OutputStream out = response.getOutputStream();
out.write(result);
out.flush();

} catch (IOException e) {
System.out.println("Servlet Error" + e);
}
}
}

■ Pingを処理するHandler

public class UpdateHandler {

public Hashtable ping(String name, String url)
throws Exception{

/** nameとurlを使った処理をここに実装 **/

/* Return Result of this Handler */

Hashtable result_hash = new Hashtable();

result_hash.put("message", "Thanks for the ping");
result_hash.put("error", Boolean.FALSE);
return result_hash;
}
}

■ PingをするClient(Formn入力でServletのクライアントにGetする)

public class PingClient extends HttpServlet{

String xmlrpc_url = "PingするXML-RPCのURL";

public void doGet(HttpServletRequest request, HttpServletResponse response){
String name = request.getParameter("name");
String url = request.getParameter("url");
XmlRpcClient client = null;
Hashtable result_hash = new Hashtable();

try{
XmlRpc.setEncoding("UTF-8");
client = new XmlRpcClient (xmlrpc_url);
} catch(MalformedURLException e){
System.out.println(e);
}

Vector vec = new Vector();
vec.addElement(name);
vec.addElement(url);

try {
result_hash = (Hashtable)client.execute ("weblogUpdates.ping", vec);
if (result_hash == null) System.out.println("No Result Back from execute");
}catch (IOException e){
System.out.println("IOException" + e);
}catch (XmlRpcException e){
System.out.println("XML-RPC Exception" + e);
}

response.setContentType("text/html");

try {
PrintWriter out = response.getWriter();
out.println("<HTML><BODY>PING RESULT:<BR />");

Enumeration e = result_hash.keys();

while(e.hasMoreElements()){
Object k = e.nextElement();
out.println("KEY=" + k + " : VALUE=" + result_hash.get(k) + "<BR />");
}
out.println();
out.println("</BODY></HTML>");
out.close();
}catch(Exception e) {
System.out.println("Error : PrintWriter");
}
}
}


Posted by jkanekomt at 2003年09月09日 18:12 | trackBack



Comments

下の個所はどういう意味でしょうか?

>xmlrpc.addHandler ("weblogUpdates", new UpdateHandler(xml_file));

Posted by: ななし at 2004年05月25日 02:50
Post a comment









Remember personal info?







関連記事