備忘録 the next generation

2014年末にOCN(http://yamagu.mo-blog.jp)からこちらに移転しました。

TomcatがShutdownできない問題

2009-01-14 11:08:33 | 開発

Tomcatを終了しようとすると、シャットダウンできないという問題で困っていた。
厳密には、シャットダウンできないのではなく数十秒後には
シャットダウンしているのだが、その時に以下のようなメッセージが出て
終了していた。

日本語のログでは
致命的: プロトコルハンドラの一時停止に失敗しました
java.net.ConnectException: Connection timed out: connect

英語なら
SEVERE: Protocol handler pause failed
  java.net.ConnectException: Connection timed out: connect

Googleで調べてみると、ポートがぶつかっているか
または使っていないポートの接続を待っているかのような気配。

1. とりあえず、server.confの以下のようなAJPの箇所をコメントアウトして、
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

2. さらに8443ポートあたりが臭いので、これを8444などに変更した。
redirectPort="8443"

2番は、1台のサーバ上で複数のTomcatを動かしている場合には
問題になりそうなポイントだ。

この2点のどっちが利いているいるのかは不明だが、
とりあえず即時shutdownできるようになった。

------

2011-03-02追記

Tomcatがシャットダウンできないという問題で、Googleから訪れる方が多いようなので、一般論を追記します。

Tomcatがシャットダウンできない場合、原因はいくつか考えられますが、catalina.outなどのログを見ても問題が見当たらないような場合は何かのスレッドが終了せずに残っていることが多いと思います。UNIXなどの場合はまずはkill -QUIT [PID]などとしてシグナルを送信してスレッドダンプを取り、どのようなスレッドが残っているのか確認するところが手始めでしょうか。


Struts2とjava.sql.Date

2008-11-11 15:47:24 | 開発

Struts2ではPOJOにjava.sql.Dateを使っても行けているような気がしていたが(気のせい?)Struts2.1では少なくともだめなようだ。getterがjava.sql.Dateを受け取るようにしている場合、以下のような例外が出る。

Caused by: java.text.ParseException: Unparseable date: "2008-11-06T00:00:00+09:00"
        at java.text.DateFormat.parse(DateFormat.java:337)
        at com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter.doConvertToDate(XWorkBasicConverter.java:357)
        ... 81 more

java.util.Dateのgetterを用意すればこの問題は起きないようだ。


springの設定ミス

2008-04-28 13:36:49 | 開発

Struts2の上のActionがあるときを境にして、

No result defined for action [アクション名] and result input

というメッセージを吐いて全て動かなくなってしまった。

このメッセージを素直に解釈するとActionにinputというメソッドがないということだが、inputというメソッドを全てのActionに意図して設けようとしたこともないし、どこにもそのような設定はしていない。せいぜい、あるとすれば全てのActionでValidationが有効になってしまって、Validationの失敗でinputメソッドが呼ばれていることだろうか、というぐらいだ。

しかし実際の原因はSpringの設定ミスだったようで、applicationContext.xml内のMapFactoryBeanのオブジェクトがautowireをtypeで設定していたために意図していないActionに対しても設定されてしまっていたのが原因のようだ。

つまり、setXXX(Map)を持っているようなAction全てにそのマップがセットされてしまったことによって、何故かは詳細は分からないがどのActionでもinputメソッドへ飛ばされるという不可思議な動作になってしまったようだった。

type でautowireするのは危険なので、やめておいた方が良いのだろうか。bean単位でautowireの設定をできれば、Mapだけをnameでautowireすることができるのだが、そのような設定方法はないようだし。


一瞬悩む(プログラミング)

2005-09-13 18:46:54 | 開発
C#で、ハッシュはHashtableオブジェクトを使う。それはいい。データを追加するにはAddメソッドを使う。それもいい。

キーで値を取得するには、Getなんとか・・・あれ?無い?

そこですかさず、ブラケットを使ってみるとどうやらこれが正解。ハッシュは演算子がオーバーロードされてましたか。。。ホントにそれでいいんか?