Java

2012.11.01

Apache-Tomcat通信で接続エラー

Apache-Tomcatの通信部分でApache側に

APR does not understand this error code:


All workers are in error state for route

といったエラーが発生。

連続してリクエストを投げ続けているとき(処理し続けているとき)は、何の問題もなく安定しているのですが、数時間リクエストがなくなっている状態から、再度リクエストを投げ始めたときにしばしば発生しているようです。

mod_proxy_ajpでエラー発生。。。mod_proxy_ajp で Apache と Tomcat の間の通信が切断されてしまう の内容に近い感じでしょうか。
私のところの環境では、ApacheとTomcatの間にFirewallを設置しています。

BalancerMemberのところでは、disablereuse=on keepalive=offのパラメータを指定しているのですが、それが上手く効いていないんでしょうかね??(他に、AJPの場合は関係ないのかもしれませんが、mod_proxy - ProxyPass、BalancerMemberのパラメータのdocumentを読んだのでまとめたを参考に、 SetEnv proxy-nokeepalive 1の設定も行っています)

mod_proxyの資料 では、

disablereuse:Apacheとバックエンドサーバの間にファイアウォールが存在して切断を切られる場合は On に設定する
keepalive:バックエンドサーバと Apache の間にファイアーウォールがある場合には、 このパラメータを使う。

とあります。コネクションプーリングをしないと、keepaliveを行う必要はないのでは? と思ったりするんですよね・・・(なので、disablereuse=on keepalive=off という設定にしています)。まさか、設定が、onでは駄目でOnにしなければならないとか言うことはないと思うのですが・・・(ソースでIgnoreCaseあるいはUpperCaseなどをしているかどうか確認すれば確実なのですが)。

Firewallの部分の設定を変更してもらえるようであれば、そちらで対応するのが確実かな・・・。

| | Comments (0) | TrackBack (0)

2012.10.02

JAXBとプリミティブ型

久しぶりにJAXB使ってます。

@XmlElement(required = false)
public boolean someflag;

のような感じで定義したものを元にスキーマを生成しても、必須扱いになってしまう・・・(スキーマに、 minOccurs="0" が設定されない)。

何のことはない、プリミティブ型で定義していることが原因でした(Javaのプリミティブ型には null がないので、「何らかの値が必要」となってしまう、ってことなんでしょう)。

@XmlElement(required = false)
public Boolean someflag;

のような感じで、定義すればOK。

まぁ、知っていればなんてことない内容ではあるのですが。

| | Comments (0) | TrackBack (0)

2012.05.15

psi-probeでグラフが表示されない

久しぶりにがっつりとサーバーのセットアップを行うと、いろんなことを忘れていますね・・・。

Lambda Probeの後継である psi-probe ですが、グラフが表示されないという現象に。

何のことはない、JFreeChart:NoClassDefFoundError の現象でした。

Tomcatの起動設定ファイルに、 -Djava.awt.headless=true を追加して、解決。

※環境によっては、Lambda Probeでグラフが表示されない のケースもあるかとは思いますが。

| | Comments (0) | TrackBack (0)

2011.11.13

Tomcat JDBC Pool

Commons DBCPを超えるTomcat JDBC Poolとは

いろいろと機能が追加されていっているんですね~。

Tomcat7は・・・実はまだ使ったことなかったりしますが(^^;

さすがに、実稼働させている環境(Tomcat5.5だったりTomcat6だったり)を入れ替えるってわけにもいかないですからねぇ(苦笑)。

psi-probeもTomcat7に対応済みのようですね。

| | Comments (0) | TrackBack (0)

2011.10.17

JavaOne Tokyo 2012

JavaOne Tokyo 2012・・・4/4(水)~4/5(木)の2日間ですか・・・。

残念ながら、この期間は無理っぽいかなぁ・・・(涙

#いつの間にか、前回(2005年)参加してから6年も経っているんですねぇ。

| | Comments (0) | TrackBack (0)

2011.07.17

EclipseのWindowBuilder

Eclipse 3.7 (Indigo) から、WindowsBuilderが同梱され、GUIアプリの開発もある程度楽に行えるようになったとのことですが・・・WindowsBuilderは、元々は商用だったものですが、Googleに買収され、無償化されたものなのですね。

Java用のGUIアプリを作成する機会もそう多くはない(メインはWebアプリ)のですが、今のところ一番使い慣れた言語でもあるので、今度何かの機会があれば使ってみるとしますか。

| | Comments (0) | TrackBack (0)

2011.05.27

Java SE7

Java SE 7徹底理解 第1回 言語仕様の小さな変更 - Project Coin

私自身が実際にJava7で開発を行うようになるのがいつになるかは不明ですが(^^;

【Switch文で文字列】
・デコンパイル結果を見ると、ちょっと微妙かも・・・。
・同じ文字列から得られるハッシュ値は常に一定である、という前提のようですが、JVMのバージョンアップでハッシュ値計算アルゴリズムが変わった場合にどうなるんだろうか・・・?(まぁ、変わることはないような気もしますが)

【2進数リテラルと整数リテラル区切り文字】
・数値に区切り文字を含めることができるのは、そこそこ便利かも。
・カンマを使えず、"_"(アンダースコア)なのは仕方がないところでしょうかね・・・。

【例外のマルチキャッチと安全な再スロー】
・これは欲しかった機能かも。たくさんの例外をキャッチしなければいけないような処理の際に便利そう(例外発生時の処理の内容次第かとは思いますが)。

【ジェネリクスの省略記法】
・これも欲しかった機能かも。JavaSE5/6でのジェネリクスの記述って、微妙に冗長な感が否めないので・・・。

【リソースに対するtry節】
・これもよさげ。
・C#で言うところの、using節に似たような感じでしょうかね?

| | Comments (0) | TrackBack (0)

2011.05.20

XLSBeansでDate型にマッピング

Excelのデータの読込は、これまで Java Excel ApiApache POI を使っていたのですが、今回、何となく XLSBeans を使ってみました(ExCella にも興味があったのですが)。

@LabelledCell アノテーションを複数指定することで、「タイトル」的なものを複数持たせることができるんですね。で、どこからを「1行分のデータ」として認識させるのかと思っていたら、@HorizontalRecords アノテーションで tableLabel を指定すると、その次の行をヘッダー行として認識するような感じでしょうか?

で、ちょっとはまったのが、java.util.Date型へのバインドができないってことでしょうか。ソースを追ってみると、 net.java.amateras.xlsbeans.Utils#convertValue(Class type, String value) の処理で、Date型が処理されていないことが関係しているのではないかと(セルの値が String で渡されていることも関係?)。
Date型を諦めてStringにしてマッピングし、実際に使用する時にDate型に戻すことも考えたのですが、

} else if(type.equals(Date.class)) {
  if (value.length() == 0) {
    return null;
  }
  SimpleDateFormat f = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
  try {
    return f.parse(value);
  } catch (ParseException e) {
    return null;
  }
}

のような感じの処理を追加して対応。本当は、DateFormatでいろいろと考慮しなければいけないような気がするのですが、用途が限定されているので今回はこれで誤魔化しています(^^;

[XLSBeans]型変換を拡張できるようにして欲しい が近い内容のような感じですね。

| | Comments (0) | TrackBack (0)

2011.05.12

JavaからwdCalendarのDBにアクセス

普段からphpで開発している人に取っては、wdCalendarのデータを元にiCal形式のテキストを出力する処理をphpで記述するなんて、おそらくなんてことない内容だと思われます。きっと、1時間もあればサクッと作れてしまうのではないかと。

しかしながら、私にとってはphpはほとんど未知の言語(phpで記述されたアプリのインストールや、ほんの少しの手直し(「直し」とも呼べないような内容)程度しかできない状態)。まぁ、これを機にphpの勉強をする、という選択肢もあるのかもしれませんが、事情により、Javaで記述することに(^^; wdCalendarを動作させようとしているサーバーは、幸いTomcatも動作させることができる余力はあるので。

JDBCドライバの設定をしてデータ取得のテスト(フレームワークとしてはTeeda/S2Daoを使用)。

・・・見事に、文字化け(苦笑)したので、その対処法のメモ。

参考資料:MySQL:4.1日本語問題

■mysqlの動作環境をutf8にする
/etc/my.cnf に以下の内容を記述し、MySQLを再起動。

[client]
default-character-set = utf8

[mysqld]
default-character-set = utf8
skip-character-set-client-handshake

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8

■wdCalendar用のDBを再作成
setup.sql では、create tableの際にlatin1が指定されてしまっているので、utf8に変更。

ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
の部分を、
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
に。
既にテーブルを作成している場合、 drop table jqcalendar; を実行してテーブルを削除しておきます。
データの移行が必要な場合、何らかの方法で対処する必要があります(今回は、テスト用のデータしか入力していなかったのでデータの移行なしに再作成を実施)。

とりあえず、この状態で、wdCalendarのサンプルスクリプト(php)で登録した内容を、文字化けすることなくJavaから参照することができました。もちろん、phpの画面からも問題なく表示できています。

ってことで、とりあえず環境は整った(?)ので、あとはがしがし実装するだけ・・・のはず。

#Teedaで使うdiconファイル等の設定も含め、ここまでの作業時間は1時間程度。う~ん・・・(苦笑)。

| | Comments (0) | TrackBack (0)

2011.04.27

CentOS5.5にTomcat6稼働環境を (設定)

参考:CentOS 5 に Tomcat 6 をインストールする

実際、ディレクトリ以外はほとんどそのままですが(^^;

デーモンを稼働させるユーザーを追加し、ファイルの所有者を変更。

# useradd -d /usr/local/share/tomcat6 -s /sbin/nologin tomcat
# chown -R tomcat /usr/local/share/apache-tomcat-6.0.32
# chown -R tomcat /usr/local/share/tomcat6

デーモンとして動かすためのjsvcをビルドするために、コンパイラをインストール(コンパイラすら入っていない環境だったので)。

# yum install compat-libstdc++-33 gcc gcc-c++

jsvcをビルド。

# cd /usr/local/share/tomcat6/bin
# tar zxvf commons-daemon-native.tar.gz
# cd commons-daemon-1.0.5-native-src/unix/
# ./configure --with-java=/usr/local/share/java
# make
# chown tomcat jsvc
# mv jsvc /usr/local/share/tomcat6/bin/

起動用スクリプト(/etc/init.d/tomcat6)を作成(参考にしたURLで公開されていたもののパス情報を書き換えただけですが・・・)。

#!/bin/sh
#
# chkconfig: - 80 20
# description: tomcat

# Source function library.
. /etc/init.d/functions

JAVA_HOME=/usr/local/share/java

CATALINA_HOME=/usr/local/share/tomcat6
TOMCAT_USER=tomcat
TMP_DIR=/tmp
CATALINA_OPTS=
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar
PIDFILE=/var/run/tomcat.pid
LOCKFILE=/var/lock/subsys/tomcat
DAEMON=$CATALINA_HOME/bin/jsvc

start(){
    #
    # Start Tomcat
    #

    echo -n "Starting tomcat: "
    $DAEMON \
    -pidfile $PIDFILE \
    -user $TOMCAT_USER \
    -home $JAVA_HOME \
    -Dcatalina.home=$CATALINA_HOME \
    -Djava.io.tmpdir=$TMP_DIR \
    -outfile $CATALINA_HOME/logs/catalina.out \
    -errfile '&1' \
    $CATALINA_OPTS \
    -cp $CLASSPATH \
    org.apache.catalina.startup.Bootstrap

    #
    # To get a verbose JVM
    #-verbose \
    # To get a debug of tomcat.
    #-debug \
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
        echo_success
        touch $LOCKFILE
    else
        echo_failure
    fi
    echo
}

stop(){
    #
    # Stop Tomcat
    #
    echo -n "Shutting down tomcat: "
    $DAEMON \
    -stop \
    -pidfile $PIDFILE \
    org.apache.catalina.startup.Bootstrap
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
        echo_success
        rm -f $PIDFILE $LOCKFILE
    else
        echo_failure
    fi
    echo
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        status $DAEMON
        RETVAL=$?
        ;;
    *)
        echo $"Usage: tomcat {start|stop|restart|status}"
        exit 1
        ;;
esac

自動起動の設定。

# chkconfig tomcat6 on

起動し、動作確認。

# /etc/init.d/tomcat6 start
# w3m http://localhost:8080/

| | Comments (0) | TrackBack (0)

より以前の記事一覧