// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
今回のPingをうつプログラムとは直接関係ないですが、Pingを受け取るServletを作ってみました。Ping対象サーバとしてこのServletを指定しておいて、確かにPingがうたれたことをログに残すなど、なんか使い道もありそうです。
今回のPingアプリケーションの機能要件とは直接関係ないですが、Pingを受け取るServletを作ってみました。Ping対象サーバとしてこのServletを指定しておいて、確かにPingがうたれたことをログに残すなど、なんか使い道もありそうです。


うけつけるサーブレットでは、おなじみの[[Apache XML-RPC:http://ws.apache.org/xmlrpc/]]を用います。

サーブレットのクラス名は
 nu.mine.kino.servlets.ping.PingReceiver
としました。

サーブレットのdoPostを以下の通りOverrideします。

 protected void doPost(HttpServletRequest request,
       HttpServletResponse response) throws ServletException, IOException {
   logger.debug("doPost(HttpServletRequest, HttpServletResponse) - start");
 
   XmlRpc.setEncoding("UTF-8");
   XmlRpcServer xmlrpc = new XmlRpcServer();
 
   // Handlerの追加。このハンドラは、weblogUpdates.ping というサービスを持っている。
   // pingはメソッド名。
   xmlrpc.addHandler("weblogUpdates", new UpdateHandler()); // 後述
   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) {
     logger.error("doPost(HttpServletRequest, HttpServletResponse)", e);
   }
 
   logger.debug("doPost(HttpServletRequest, HttpServletResponse) - end");
 }

ここで
 xmlrpc.addHandler("weblogUpdates", new UpdateHandler()); // 後述
の意味ですが、このエンドポイントのweblogUpdates.hogeというメソッド名がよばれたら、UpdateHandlerというクラスのhogeというメソッドを呼び出すよ、という意味になります。


UpdateHandlerは特別なインタフェースを実装するわけではなく、hogeに相当するメソッドを定義しておきます。具体的には以下の通り。

 public class UpdateHandler {
   /**
    * Logger for this class
    */
   private static final Logger logger = Logger.getLogger(UpdateHandler.class);
 
   // pingというメソッド名を定義
   public Hashtable ping(String name, String url) throws Exception {
     logger.debug("ping(String, String) - start");
 
     logger.debug("Name: " + name);
     logger.debug("url : " + url);
 
     Hashtable result_hash = new Hashtable();
     result_hash.put("name", name);
     result_hash.put("url", url);
 
     result_hash.put("message", "Thanks for the ping");
     result_hash.put("error", Boolean.FALSE);
 
     logger.debug("ping(String, String) - end");
     return result_hash;
   }
 }

これで、このエンドポイントのweblogUpdates.pingというメソッド名がよばれたら、このクラスのpingメソッドが呼び出されます((もしくは org.apache.xmlrpc.XmlRpcHandler をimplementsしてpublic Object execute(String method, Vector params) をOverrideしてもいい。引数のmethodは"weblogUpdates.ping"などのメソッド名、paramsはパラメタのリスト))。






ちなみに、このサービスのエンドポイントは
 http://[サーバ名]/[context]/[サーブレット名]
となります。ここでは
 http://localhost:8080/PingWeb/PingReceiver
としました。
 


----
この記事は
#vote(おもしろかった,そうでもない)

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS