障害URL一覧機能

他に良い呼び名が思いつかなかったので、クロールしてExceptionが発生したURLを障害URLという感じで呼んでいるのだけど、それを確認できる機能を追加してみた(4.0.0-SNAPSHOT)。これは要望頂いた機能を実装してみた感じです。障害URLを保持することができるようになったので、次はこれを元に次回クロール時には障害URLはスキップする機能を付けようかと思っています。

あとは、細かいところですが、管理画面の左側にあるメニューの数が20個を超える感じになり、ぱっとみでどこに何があるかわかりにくいので、分類してみました。

4.0のリリースまではまだ時間がある感じですが、やることとしては、

  • クリックログ
  • ログ集計
  • NTLM認証対応(どこまでやるか未定)

な感じでしょうか。既にクロール処理に関しては Commons HttpClient 3.1 から HttpComponent HttpClient 4.1系に移行済みなので、NTLMまわりもいろいろとできるはずかと思っています。

そんな感じですが、Fess の新しい機能を見てみたい(または、テストしていただける)方は、ぜひ、4.0.0-SNAPSHOT を使っていただければ助かりますー。

HttpClient 3 から 4 へ

日本語だと HttpClient 4 を使っている人をあまり見ないような気もするけど(気のせい?)、3 から 4 にするとどう違うかを超簡単に示すと、

// Create an instance of HttpClient.
HttpClient client = new HttpClient();
// Create a method instance.
GetMethod method = new GetMethod(url);
try {
// Execute the method.
int statusCode = client.executeMethod(method);
// Read the response body.
InputStream is = method.getResponseBodyAsStream();
... 何かする ...
} catch (Exception e) {
... 何かする ...
} finally {
// Release the connection.
method.releaseConnection();
}

という感じで今まで書いていたと思うけど、

// Create an instance of HttpClient.
HttpClient httpclient = new DefaultHttpClient();
// Create a method instance.
HttpGet httpget = new HttpGet(url);
HttpEntity entity = null;
try {
// Execute the method.
HttpResponse response = httpclient.execute(httpget);
int statusCode = response.getStatusLine().getStatusCode();
entity = response.getEntity();
// Read the response body.
InputStream is = entity.getContent();
... 何かする ...
} catch (Exception e) {
... 何かする ...
} finally {
// Release the connection.
if (entity != null) {
entity.consumeContent();
}
}
httpclient.getConnectionManager().shutdown();

という感じ。

まず、DefaultHttpClient を生成する。今までのHttpClientと思って良いだろう。メソッドクラス系の GetMethod などは、HttpGet などに置き換わっている。まぁ、これも特に問題ないだろう。メソッドの実行については execute メソッドを利用する。引数は HttpGet などのメソッドだ(本気で HttpClient 4 を使う場合はリクエストヘッダーなどのパラメータなども渡したくなるからHttpContextも渡すメソッドを使うことになるだろう)。executeメソッドを実行すると HttpResponse が返ってくる。なので、レスポンスはここから取得する。ステータス系は getStatusLine メソッドで取得できる。レスポンスの本文は HttpEntity から取得する。getContent メソッドでストリームを取得できる。取得したら、今までのreleaseConnectionメソッドを呼んでいたところでHttpEntity の consumeContent メソッドを呼んでおく。httpclientが不要になったら、connectionManagerのshutdownをしておく。

HttpClient 4 へ移行してみた

HttpClient 4 のチュートリアルもざっくり眺め、S2Robotのコードを書き換えてみた。 S2Robot の CommonsHttpClient を捨てて置き換えかなっと始めは思っていたのだけど、別に CommonsHttpClient はまま残せるじゃん、みたいな感じでわかったのでそのまま残し、HcHttpClient なるものを追加しておいた。CommonsHttpClient のは dicon 上は有効にしていないので、今まで通りに使いたければ、s2robot_client.dicon を編集すれば良い(と思う)。まぁ、今後的には CommonsHttpClient の方はメンテしていくかはわからないけど。そんな感じで、HttpClient 3 を卒業して、HttpClient 4 使いになることができました。これで新しい機能の恩恵を受けることができるようになった…。