blogの利点というべきping機能。
pingといっても、ネットワーク上の相手ホストを見つけるpingじゃなく、XML-RPCというプロトコルを使っています。
XML-RPCメッセージはHTTP-POSTリクエストで、リクエストのbodyはXMLです。プロシージャはサーバ側で実行され、その結果もまたXML形式で返されます。
(XML-RPC仕様書より)
つまり、blogの更新をpingするというのは、XML-RPCメッセージで更新された情報をpingサーバーに送っているだけなんですね。
XML-RPCはJavaやPerl、Cなどで実装することが可能になっており、実装方法はEric Kidd氏の
XML-RPC HOWTOを見てもらったらいいと思う。
しかし、ここにはJava Servletでの実装方法が載っていないので、必要な場合は
、「weblogの更新通知PingサービスをJava Servletで実装」を見ればわかると思います。
おそらく、このページをまねて実装した場合、2点修正しないといけない箇所があると思いますので、書いておきます。
PingRecieverクラスの
doGet->doPost
XML-RPCはHTTP-POSTリクエストなので...
PingRecieverクラスの
xmlrpc.addHandler("weblogUpdates", new UpdateHandler(xml_file));
->xmlrpc.addHandler("weblogUpdates", new UpdateHandler());
UpdateHandlerクラスに引数付きのコンストラクタがないので...
参考までに、修正済みソースを載せておきます。
==Pingクライアント==
public class PingClient extends HttpServlet {
String xmlrpc_url = "http://localhost:8080/xmlrpc/servlet/PingReciever";
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String url = request.getParameter("url");
XmlRpcClient client = null;
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);
Hashtable result_hash = null;
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("
PING RESULT:
");
Enumeration e = result_hash.keys();
while (e.hasMoreElements()) {
Object k = e.nextElement();
out.println("KEY=" + k + " : VALUE=" + result_hash.get(k) + "
");
}
out.println();
out.println("");
out.close();
} catch (Exception e) {
System.out.println("Error : PrintWriter");
}
}
}
==Pingサーバ==
public class PingReciever extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
XmlRpc.setEncoding("UTF-8");
XmlRpcServer xmlrpc = new XmlRpcServer();
xmlrpc.addHandler("weblogUpdates", new UpdateHandler());
try {
byte[] result = xmlrpc.execute(request.getInputStream());
response.setContentType("text/xml");
response.setContentLength(result.length);
OutputStream out = response.getOutputStream();
out.write(result);
out.flush();
} catch (IOException e) {
System.out.println("Servlet Error" + e);
}
}
}
==XML-PRCリクエストのハンドラ==
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;
}
}
==Java ServletでPingサーバーを実装する時に必要なもの==
Java SDK、Webアプリケーションサーバ、XML-RPCモジュール