2008年5月31日土曜日

S2XML-RPCを使って、更新ping受信サーバを作ってみました。(更新ping受信サ ーバ作成その1)

作ってみたのはいいんですが、とりあえず受信した内容をログに吐くだけなのであまり意味はありませんw
今回はS2XML-RPCを使用しました。このライブラリで大分楽出来ました。ほとんど何もしてません。受信で呼び出されるPOJOのクラスをちょろっと作っただけです。
以下簡単な説明。


環境としてはtomcat6を使用しています。
必要なライブラリは
S2XML-RPC
S2
S2Remoting
です。
S2については特に説明しませんw
セッティングはS2XML-RPCのサイトの説明通りにやります。S2XML-RPC 基本的な使い方が参考になります。
web.xmlは大体そのまま使います。
    <servlet-mapping>
<servlet-name>XmlRpcServlet</servlet-name>
<url-pattern>/xmlrpc</url-pattern>
</servlet-mapping>

の部分は好きなように変更します。今回アプリケーション名をxmlrpcにするつもりだったので、ここはpingとしました。
更新pingを受信するurlはhttp://lab.ukauka.net/xmlrpc/pingです。(現在このURLで稼動していますがこのリンクをクリックしてもGETに対しては405が返るだけです)
app.diconは
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN"
"http://www.seasar.org/dtd/components23.dtd">
<components>
<include path="s2xmlrpc.dicon"/>
<include path="weblogUpdates.dicon"/>
</components>

とします。s2xmlrpc.diconはライブラリに含まれているので用意する必要はありません。weblogUpdates.diconは今回受信するxmlrpcのメソッド名にあわせました。
weblogUpdates.diconは
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN"
"http://www.seasar.org/dtd/components23.dtd">
<components>
<component name="weblogUpdatesService" class="net.ukauka.xmlrpc.WeblogUpdatesServiceImpl">
<meta name="xmlrpc"/>
</component>
</components>

としています。更新pingで呼び出されるクラスを設定しているだけです。
設定ファイルで必要なのはこんなものです。ログ吐き用にlog4jの設定もいじりましたが端折ります。
次にプログラム部分です。
まずはインタフェース。
net.ukauka.xmlrpc.WeblogUpdatesService
package net.ukauka.xmlrpc;
import java.util.Map;
public interface WeblogUpdatesService{
public Map ping(String weblogname, String weblogurl, String changesur, String categoryname);
public Map ping(String weblogname, String weblogurl);
}

こんだけです。返り値がMapなのは更新pingの仕様を見てみると返り値にstructとあったので構造体? と思ったのですが実際やってみるとMapで受け取れたのでこうしています。
更新pingの引数は
weblogname(ブログ名)、weblogurl(ブログURL)が必須で
changesur(更新されたページのURL)、categoryname(カテゴリ名)がオプションになっています。
実際いくつかのブログで(といってもFC2とSeesaaだけですが)試してみたところオプションは送られてこなかったので必要ないのかもしれませんが、一応インタフェイスは用意しておきました。
次にクラスです。
net.ukauka.xmlrpc.WeblogUpdatesServiceImpl
package net.ukauka.xmlrpc;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class WeblogUpdatesServiceImpl implements WeblogUpdatesService {
protected Log log = LogFactory.getLog(this.getClass());
public Map ping(String weblogname, String weblogurl, String changesurl,
String categoryname) {
StringBuffer sb = new StringBuffer();
sb.append("weblogname:" + weblogname + "\n");
sb.append("weblogurl:" + weblogurl + "\n");
sb.append("changesurl:" + changesurl + "\n");
sb.append("categoryname:" + categoryname + "\n");
log.debug(sb.toString());
Map map = new HashMap();
map.put("message", "ok");
map.put("flerror", new Boolean(false));
return map;
}
public Map ping(String weblogname, String weblogurl) {
return ping(weblogname, weblogurl, "", "");
}
}

受信するだけならこんなもんです。
フレームワークがweblogUpdates.pingというメッセージを受信したらそのパラメータを引数にしてこのクラスのpingメソッドを呼び出してくれるので実装者がするのは、メッセージを受け取ってどうする? の部分だけです。楽ちんですね。
一応ここまで作ってサーバにアップロードして動作を確認しました。確かに動いてるんで公開してもいいんですが、受信内容がログに吐かれるだけですんで面白くもなんともないです。
で、更新pingを受信しただけだと引数からわかるようにブログが更新されたということしかわかりません。最新のエントリのタイトルとか更新時間などはサイトを見に行かないとわからないんですね。
と、いうことで次回はその辺も対応して、受信内容等わかるようにしたいと思います。
(ソースが見づらいですね。これもうちょっとなんとかしないとなー)

0 件のコメント:

コメントを投稿