Kohei Nozaki's blog 

ApacheとWildFlyをmod_jkで繋ぐ


Posted on Tuesday Jan 21, 2014 at 07:34AM in Technology


環境

  • さくらインターネット VPS 1G
  • CentOS 6.5
  • WildFly 8.0.0CR1
  • Apache 2.2.24
  • tomcat-connectors-1.2.37-src.tar.gz
  • ここに書いた作業をした後

何をするの?

ApacheとWildFlyをmod_jkで繋ぎます

mod_jkを入れる

ビルドとインストール

yumとかでインストール出来れば楽なのですが、見当たらなかったのでここからソースを取ってきます

sudo yum install httpd-devel
tar zxvf tomcat-connectors-1.2.37-src.tar.gz
cd tomcat-connectors-1.2.37-src/native
./configure --with-apxs=/usr/sbin/apxs
make -j 2
sudo make install

設定ファイルの雛型をコピー

sudo cp tomcat-connectors-1.2.37-src/conf/httpd-jk.conf /etc/httpd/conf.d
sudo cp tomcat-connectors-1.2.37-src/conf/workers.properties.minimal /etc/httpd/conf/workers.properties
sudo service httpd restart

動作確認

jk-status画面を表示したいのですが、localhostからのアクセスしか許可してないので、sshのトンネル経由でアクセスしてみる。手元の端末で以下を実行

ssh [SERVER ADDRESS] -L 10080:localhost:80

その後ブラウザでここを開いてみると

まだWildFly側で受け入れの設定はしてないけど一応動いてますね

WildFly側の設定

CLIの管理コンソールを起動する

sudo -u wildfly /usr/local/wildfly/bin/jboss-cli.sh

設定コマンドを打ち込む

connect
/subsystem=undertow/server=default-server/ajp-listener=myListener:add(socket-binding=ajp, scheme=http, enabled=true)
exit

こういう感じになればOK

$ sudo -u wildfly /usr/local/wildfly/bin/jboss-cli.sh
You are disconnected at the moment. Type 'connect' to connect to the server or 'help' for the list of supported commands.
[disconnected /] connect
[standalone@localhost:9990 /] /subsystem=undertow/server=default-server/ajp-listener=myListener:add(socket-binding=ajp, scheme=http, enabled=true)
{"outcome" => "success"}
[standalone@localhost:9990 /]

telnetで覗いてみる

ちゃんとポートが開いているようです

$ telnet localhost 8009
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
^]

telnet> quit
Connection closed.
$ 

Apache側の設定

ここではとりあえず何も考えず全部WildFlyに飛ばすことにします

sudo sh -c 'cat > /etc/httpd/conf.d/jk.conf' <<EOF
<IfModule jk_module>
    JkMount /* lb
</IfModule>
EOF
sudo service httpd restart
]]>

終わったらグローバルIPアドレス経由でアクセスしてみましょう。

単純な設定しかしてませんがとりあえず繋がったようですね。管理コンソールは9990番ポート経由でないとアクセス出来ないので、リモートから80番経由で管理コンソールを触られる心配はないようです。

参考文献


さくらVPSにJRE, WildFly, PostgreSQL, Apacheを入れる


Posted on Tuesday Jan 21, 2014 at 07:24AM in Technology


環境

  • さくらインターネット VPS 1G
  • CentOS 6.5
  • ここに書いた作業をした後

何をするの?

  1. JRE (jre-7u51-linux-x64.rpm) を入れる
  2. WildFly (wildfly-8.0.0.CR1.tar.gz) を入れる
  3. PostgreSQL 9.2.6を入れる
  4. Apacheを入れる

JREを入れる

いまのところこのへんにあります。私はjre-7u51-linux-x64.rpmを取ってきました。

<![CDATA[
sudo rpm -ivh jre-7u51-linux-x64.rpm
]]>

動作確認

$ java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
$ 

WildFlyを入れる

ユーザを作ります

sudo useradd wildfly

tarballを展開します

sudo tar zxvf wildfly-8.0.0.CR1.tar.gz -C /usr/local --no-same-owner
sudo chown -R wildfly:wildfly /usr/local/wildfly-8.0.0.CR1
sudo ln -s /usr/local/wildfly-8.0.0.CR1 /usr/local/wildfly

設定ファイルを作ります

sudo mkdir /etc/java
sudo sh -c 'cat > /etc/java/java.conf' <<EOF
export JAVA_HOME=/usr/java/default
EOF
sudo sh -c 'cat > /etc/default/wildfly.conf' <<EOF
export JBOSS_HOME=/usr/local/wildfly
export JBOSS_USER=wildfly
export LANG=ja_JP.UTF-8
EOF

ログとpid出力用のディレクトリを作ります

sudo mkdir /var/run/wildfly
sudo mkdir /var/log/wildfly

起動スクリプトを置きます

sudo cp /usr/local/wildfly-8.0.0.CR1/bin/init.d/wildfly-init-redhat.sh /etc/init.d/wildfly
sudo chkconfig --add wildfly
sudo chkconfig wildfly on

起動してみます

$ sudo service wildfly start
Starting wildfly:                                          [  OK  ]
$

ログとpidファイルを確認してみます

$ ls -l /var/log/wildfly
合計 8
-rw-r--r-- 1 root root 4670  1月 19 11:54 2014 console.log
$ ls -l /var/run/wildfly
合計 4
-rw-r--r-- 1 wildfly wildfly 6  1月 19 11:54 2014 wildfly.pid
$ 

ログを見てみます

=========================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: /usr/local/wildfly

  JAVA: /usr/java/default/bin/java

  JAVA_OPTS:  -server -XX:+UseCompressedOops -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true

=========================================================================

11:48:59,714 INFO  [org.jboss.modules] (main) JBoss Modules version 1.3.0.Final
11:49:05,184 INFO  [org.jboss.msc] (main) JBoss MSC version 1.2.0.CR1
11:49:05,351 INFO  [org.jboss.as] (MSC service thread 1-2) JBAS015899: WildFly 8.0.0.CR1 "WildFly" starting
11:49:07,201 INFO  [org.xnio] (MSC service thread 1-1) XNIO version 3.2.0.Beta4
11:49:07,208 INFO  [org.jboss.as.server] (Controller Boot Thread) JBAS015888: Creating http management service using socket-binding (management-http)
11:49:07,216 INFO  [org.xnio.nio] (MSC service thread 1-1) XNIO NIO Implementation Version 3.2.0.Beta4
11:49:07,278 INFO  [org.jboss.remoting] (MSC service thread 1-1) JBoss Remoting version (unknown)
11:49:07,302 INFO  [org.jboss.as.clustering.infinispan] (ServerService Thread Pool -- 33) JBAS010280: Activating Infinispan subsystem.
11:49:07,314 INFO  [org.jboss.as.naming] (ServerService Thread Pool -- 41) JBAS011800: Activating Naming Subsystem
11:49:07,325 INFO  [org.jboss.as.webservices] (ServerService Thread Pool -- 50) JBAS015537: Activating WebServices Extension
11:49:07,317 INFO  [org.jboss.as.security] (ServerService Thread Pool -- 46) JBAS013171: Activating Security Subsystem
11:49:07,376 INFO  [org.jboss.as.security] (MSC service thread 1-2) JBAS013170: Current PicketBox version=4.0.20.Beta2
11:49:07,395 INFO  [org.jboss.as.jsf] (ServerService Thread Pool -- 39) JBAS012615: Activated the following JSF Implementations: [main]
11:49:07,616 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 49) JBAS017502: Undertow 1.0.0.Beta30 starting
11:49:07,665 INFO  [org.jboss.as.naming] (MSC service thread 1-2) JBAS011802: Starting Naming Service
11:49:07,646 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-1) JBAS017502: Undertow 1.0.0.Beta30 starting
11:49:07,715 INFO  [org.jboss.as.mail.extension] (MSC service thread 1-4) JBAS015400: Bound mail session [java:jboss/mail/Default]
11:49:07,716 INFO  [org.jboss.as.connector.logging] (MSC service thread 1-4) JBAS010408: Starting JCA Subsystem (IronJacamar 1.1.2.Final)
11:49:07,725 INFO  [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 28) JBAS010403: Deploying JDBC-compliant driver class org.h2.Driver (version 1.3)
11:49:07,775 INFO  [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-1) JBAS010417: Started Driver service with driver-name = h2
11:49:07,947 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 49) JBAS017527: Creating file handler for path /usr/local/wildfly/welcome-content
11:49:07,978 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-3) JBAS017525: Started server default-server.
11:49:08,004 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-2) JBAS017531: Host default-host starting
11:49:08,497 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-4) JBAS017519: Undertow HTTP listener default listening on /127.0.0.1:8080
11:49:09,116 INFO  [org.jboss.as.remoting] (MSC service thread 1-2) JBAS017100: Listening on 127.0.0.1:9999
11:49:09,147 INFO  [org.jboss.as.server.deployment.scanner] (MSC service thread 1-1) JBAS015012: Started FileSystemDeploymentService for directory /usr/local/wildfly/standalone/deployments
11:49:09,248 INFO  [org.jboss.ws.common.management] (MSC service thread 1-3) JBWS022052: Starting JBoss Web Services - Stack CXF Server 4.2.3.Final
11:49:09,310 INFO  [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-4) JBAS010400: Bound data source [java:jboss/datasources/ExampleDS]
11:49:09,474 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015961: Http management interface listening on http://127.0.0.1:9990/management
11:49:09,475 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://127.0.0.1:9990
11:49:09,475 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015874: WildFly 8.0.0.CR1 "WildFly" started in 10253ms - Started 184 of 232 services (78 services are lazy, passive or on-demand)
ログはもう一カ所 /usr/local/wildfly/standalone/log にもあります。こっちがメインっぽいです。

listenしているポートを確認してみます

$ netstat -an | grep LISTEN | grep tcp
tcp        0      0 127.0.0.1:9999              0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:8080              0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:9990              0.0.0.0:*                   LISTEN      
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0      0 ::1:25                      :::*                        LISTEN      
$ 
localhostしかlistenしてないのでこのままでいいかな。

WildFlyの管理ユーザを作ります

別に今すぐは使いませんが一応。

sudo -u wildfly /usr/local/wildfly/bin/add-user.sh [USERNAME] [PASSWORD]

Webの管理コンソールから設定状況を見てみます

手元の端末でトンネルを作ります

ssh [IP ADDRESS] -L 10080:localhost:80 -L 19990:localhost:9990

ここにアクセスするとトンネル経由でWebの管理コンソールにアクセス出来ます。ユーザ名とパスワードは先ほど入力した物を使います。

止めてみます

$ sudo service wildfly stop
Stopping wildfly:                                          [  OK  ]
$ ps -Af | grep java
kyle     25222 24452  0 11:58 pts/0    00:00:00 grep java
$
問題なさげ。一応リブートしてシャットダウンスクリプトと起動スクリプトが走るか確認しておくとベターかも。

PostgreSQLを入れる

インストール

<![CDATA[
sudo yum install http://yum.postgresql.org/9.2/redhat/rhel-6-x86_64/pgdg-centos92-9.2-6.noarch.rpm
sudo yum install postgresql92-server postgresql92-contrib
sudo service postgresql-9.2 initdb
sudo chkconfig postgresql-9.2 on
]]>

WildFlyから接続できるように認証方式を変更する

sudo -u postgres cp /var/lib/pgsql/9.2/data/pg_hba.conf /var/lib/pgsql/9.2/data/pg_hba.conf.bak
sudo -u postgres sed -i -e "s/^host    all             all             127.0.0.1\/32            ident/host    all             all             127.0.0.1\/32            md5/" /var/lib/pgsql/9.2/data/pg_hba.conf

動かしてみる

$ sudo service postgresql-9.2 start
Starting postgresql-9.2 service:                           [  OK  ]
$

Apacheを入れる

インストール

sudo yum install httpd
sudo chkconfig httpd on

動かしてみる

$ sudo service httpd start
Starting httpd:                                            [  OK  ]
$

アクセスしてみる

普通に手元の端末のブラウザからアクセス可。

参考文献


さくらVPSの初期設定をしてみる


Posted on Tuesday Jan 21, 2014 at 06:43AM in Technology


環境

  • さくらインターネット VPS 1G
  • CentOS 6.5

何をするの?

  1. 一般ユーザを作る
  2. 作ったユーザの公開鍵を置く
  3. 作ったユーザがsudo出来るようにする
  4. sshのパスワード認証を無効化
  5. ssh以外のポートが空いてない事を確認
  6. iptablesでsshとhttp以外を遮断
  7. IPv6を無効化

接続まで

Webから申し込みをして5分ほどで、IPアドレスとrootアカウントのパスワードが書かれた仮登録完了メールが届くが、この時点ではまだ起動していないのでVPSコントロールパネルから起動してやらないといけない。さらにVPSコントロールパネルからリモートコンソールを開くとOSの起動ログが見える。リモートコンソールでログインプロンプトが表示されたのを確認してからsshで接続すると良い。

OSのアップデート

まあ一応ログインしたらすぐやっておく。やってみたけど特に何も更新はなかった。

yum update

ユーザを作る

面倒くさいけどsshでrootログイン出来るとか若干気持ち悪いのでやっておきましょう。こういう感じ

# adduser kyle
# passwd kyle
ユーザー kyle のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: 全ての認証トークンが正しく更新できました。
# 
終わったら作ったユーザでログインし直しましょう。

公開鍵を置く

こんな感じかと

<![CDATA[
cd
mkdir .ssh
chmod 700 .ssh
cat > .ssh/authorized_keys << EOF
[YOUR PUBLIC KEY HERE]
EOF
chmod 600 .ssh/authorized_keys
]]>
実行するとこうなる
$ ls -ld .ssh
drwx------ 2 kyle kyle 4096  1月 19 09:08 2014 .ssh
$ ls -l .ssh
合計 4
-rw------- 1 kyle kyle 408  1月 19 09:08 2014 authorized_keys
$ 

sudo出来るようにする

suしてvisudoを起動します

$ su - 
パスワード:
# visudo
起動したら一番下に以下を追加。面倒くさいので全部パスワード不要にする。
kyle    ALL=(ALL)       NOPASSWD: ALL
確認してみよう
$ sudo whoami
root
$ 
大丈夫そうですね

sshのパスワード認証を無効にする

日常的にブルートフォースアタック的なものが飛んでくる今日においては嫌な感じなので無効にしておきましょう

cd /etc/ssh
sudo cp sshd_config sshd_config.bak
sudo sed -i -e "s/^PasswordAuthentication yes/PasswordAuthentication no/" sshd_config
変更したら再起動
sudo service sshd restart
万が一入れなくなったらWebのリモートコンソールからログインしてなんとかしましょう。

空いてるポートを確認する

$ netstat -an | grep LISTEN | grep tcp
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0      0 ::1:25                      :::*                        LISTEN      
$ 

22と25だからsshとメールですかね。外に向けて空いてるのはsshだけだ。

ポートスキャンサービスを使って空いてるポートを確認する

25番が空いてるか閉じてるか手元の端末から叩いても分からない(そもそも25番向けの外向きパケットはほとんどのISPで遮断される?)し、念のためポートスキャンサービスを使って確かめてもらいます。

ここを使います。GRC | ShieldsUP! — Internet Vulnerability Profiling ここで問題なのがこのサービスは、そのサービスにアクセスしたIPアドレスに対してしかスキャンかけてくれない事ですね。まあしょうがない。ゆえに若干力技ですがsshを使ってsocksのトンネル(?)を使ってアクセスします。手元の端末で以下を叩くと手元の端末でsocksサーバが立ち上がります。Windowsでもputtyの設定でゴニョゴニョすればsocksサーバ立てられたはず。

ssh [YOUR VPS IP ADDRESS HERE] -D 1080
こうすると手元の1080番にsocksサーバが立ち上がり、VPSを通じてWebアクセスができるようになります。socks用WebブラウザとしてはOperaが良い。OSのプロキシの設定いじらなくても独立した設定をアプリで持ってくれるので。こんな感じになります

Proceedっていうボタン押して遷移する画面でAll Service Portsを押すとポートスキャンが始まります

----------------------------------------------------------------------

GRC Port Authority Report created on UTC: 2014-01-19 at 00:55:26

Results from scan of ports: 0-1055

    1 Ports Open
 1055 Ports Closed
    0 Ports Stealth
---------------------
 1056 Ports Tested

NO PORTS were found to be STEALTH.

The port found to be OPEN was: 22

Other than what is listed above, all ports are CLOSED.

TruStealth: FAILED - NOT all tested ports were STEALTH,
                   - NO unsolicited packets were received,
                   - A PING REPLY (ICMP Echo) WAS RECEIVED.

----------------------------------------------------------------------

開いてるのはsshだけですね。25番は127.0.0.1に対してしかlistenしてないから出てきません。

iptablesの設定

別にこのままでもいいのですが、PING返したくないし、一応念のためにiptablesの設定もします。sshとhttpだけ開けます。

sudo sh -c 'cat > /etc/sysconfig/iptables' <<EOF
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
COMMIT
EOF
sudo service iptables restart

この状態で再度ポートスキャンしてみるとこんな感じ

----------------------------------------------------------------------

GRC Port Authority Report created on UTC: 2014-01-19 at 04:32:40

Results from scan of ports: 0-1055

    1 Ports Open
    1 Ports Closed
 1054 Ports Stealth
---------------------
 1056 Ports Tested

The port found to be OPEN was: 22

The port found to be CLOSED was: 80

Other than what is listed above, all ports are STEALTH.

TruStealth: FAILED - NOT all tested ports were STEALTH,
                   - NO unsolicited packets were received,
                   - NO Ping reply (ICMP Echo) was received.

----------------------------------------------------------------------

IPv6の無効化

Apacheの設定とかで微妙にはまりそうな気配なので無効化しておく

sudo cp /etc/sysconfig/network /etc/sysconfig/network.bak
sudo sed -i -e 's/NETWORKING_IPV6="yes"/NETWORKING_IPV6=no/' /etc/sysconfig/network
echo 'options ipv6 disable=1' | sudo sh -c 'cat > /etc/modprobe.d/disable-ipv6.conf'
sudo chkconfig ip6tables off

参考文献


動かしてみる


Posted on Tuesday Jan 21, 2014 at 06:40AM in JBatch


jbatch(JSR352)とはJavaEE7から入ったバッチフレームワークの規格です。WildFly8ではGlassFish4とは別の実装が使われています。すごく簡単なのをWildFly8で動かしてみます。

環境

  • WildFly 8.0.0CR1
  • Eclipse等々はここで設定した状態

CDIの設定をする

プロジェクトの設定を開いてProject Facetsを選びCDIにチェックを入れてOKを押します。

ジョブXMLファイルを作る

ジョブを起動すると、まずこのXMLファイルがロードされます。JSR352ではアプリ開発者はこのXMLファイルとartifactと呼ばれるクラス群を作る必要があります。まずXMLファイルが読まれ、ここに書かれた通りにartifactが呼び出されます。

作る場所はこのへん.画像では/src/main/javaの下になっていますが,XMLファイル等のJavaソース以外のものは/src/main/resourcesに置くのが望ましいです.war内の位置で言うとclasses/META-INFの下になります。このファイルの名前がバッチの名前になります。

内容はとりあえずこんな感じ。
<?xml version="1.0" encoding="UTF-8"?>
<job id="job001" version="1.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
	<step id="step001">
		<batchlet ref="testBatchlet"/>
	</step>
</job>

Batchletを作る

Batchletは簡単な処理を書くときに使います。バルク処理とかをやるときは、ここで紹介するBatchletではなく、chunk方式と呼ばれるartifactを使ったほうがよいです。作るクラス1つだけで簡単なのでここではBatchletを作ります。XMLファイルとartifactはCDIの名前でひも付けるので、作る場所はどこでも良いです。

package com.example;

import javax.batch.api.AbstractBatchlet;
import javax.inject.Named;

@Named
public class TestBatchlet extends AbstractBatchlet{

	@Override
	public String process() throws Exception {
		System.out.println("Hello JSR352");
		return "SUCCESS";
	}
}

Servletを作る

バッチを動かす際の起点にします。ブラウザでServletにGETを飛ばすとバッチが動き出す感じです。定時実行とかスケジュール実行がしたければEJBタイマでやることもできます。

package com.example;

import java.io.IOException;
import java.util.Properties;

import javax.batch.runtime.BatchRuntime;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		
		long executionId = BatchRuntime.getJobOperator().start("job001", new Properties());
		response.getWriter().write("execution id: " + executionId);
	}
}

動かしてみる

デプロイしたらブラウザでアクセスしてみましょう

動いているようです。それっぽいログも出ています

ジョブを実行するとDB等にかなり詳細な履歴が残せるのですが、WildFly8のデフォルトではインメモリデータベースに格納されるだけになっているようで、後から参照する方法とかは少し調べましたが不明です。DBに残すようにする設定の方法はまた別途調べる予定。

JobOperator#start()で返るのはexecutionIdといって、このIDを使って実行中のバッチを止めたり、途中で死んだバッチを再実行したりできます。バッチの実行ごとに採番されます。リロードすると数字がインクリメントされていきます。


CLIでデータソースを定義する


Posted on Tuesday Jan 21, 2014 at 06:37AM in Technology


環境

  • WildFly 8.0.0CR1
  • PostgreSQL 9.2.4
  • postgresql-9.3-1100.jdbc41.jar

何をするの?

CLIからPostgreSQLのデータソースを定義してみます

JDBCドライバをデプロイ

方法1

WildFlyを展開したディレクトリ内の/standalone/deploymentsディレクトリにJDBCドライバを放り込むだけです。

方法2

[3]の下の方にPostgreSQLの例が書いてある。こっちの方が正規の手順っぽい。8.0.0.Finalだけどやってみる

資源を置く

kyle-no-MacBook:wildfly-8.0.0.Final kyle$ mkdir -p modules/org/postgresql/main
kyle-no-MacBook:wildfly-8.0.0.Final kyle$ cd modules/org/postgresql/main
kyle-no-MacBook:main kyle$ cp ~/Downloads/postgresql-9.3-1100.jdbc41.jar .
kyle-no-MacBook:main kyle$ cat > module.xml << EOF
> <?xml version="1.0" encoding="UTF-8"?>
> <module xmlns="urn:jboss:module:1.0" name="org.postgresql">
>     <resources>
>         <resource-root path="postgresql-9.3-1100.jdbc41.jar"/>
>     </resources>
>     <dependencies>
>         <module name="javax.api"/>
>         <module name="javax.transaction.api"/>
>     </dependencies>
> </module>
> EOF

(貼付け用)

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="org.postgresql">
    <resources>
        <resource-root path="postgresql-9.3-1100.jdbc41.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
    </dependencies>
</module>

jboss-cliを使って登録する

kyle-no-MacBook:main kyle$ ~/apps/wildfly-8.0.0.Final/bin/jboss-cli.sh --connect
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
[standalone@localhost:9990 /] /subsystem=datasources/jdbc-driver=postgresql:add(driver-name=postgresql,driver-module-name=org.postgresql,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource) 
{"outcome" => "success"}
[standalone@localhost:9990 /] ls subsystem=datasources
data-source                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
jdbc-driver                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
xa-data-source                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
installed-drivers=[{"driver-name" => "h2","deployment-name" => undefined,"driver-module-name" => "com.h2database.h2","module-slot" => "main","driver-datasource-class-name" => "","driver-xa-datasource-class-name" => "org.h2.jdbcx.JdbcDataSource","driver-class-name" => "org.h2.Driver","driver-major-version" => 1,"driver-minor-version" => 3,"jdbc-compliant" => true},{"driver-name" => "postgresql","deployment-name" => undefined,"driver-module-name" => "org.postgresql","module-slot" => "main","driver-datasource-class-name" => "","driver-xa-datasource-class-name" => "org.postgresql.xa.PGXADataSource","driver-class-name" => "org.postgresql.Driver","driver-major-version" => 9,"driver-minor-version" => 3,"jdbc-compliant" => false}]  
[standalone@localhost:9990 /] 

データソースの定義

jboss-cliの起動と接続

$ ./jboss-cli.sh
You are disconnected at the moment. Type 'connect' to connect to the server or 'help' for the list of supported commands.
[disconnected /] connect
[standalone@localhost:9990 /] 

使用可能なJDBCドライバ一覧を表示

デプロイしたものが出てきていることを確認します

[standalone@localhost:9990 /] ls subsystem=datasources
data-source                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
jdbc-driver                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
xa-data-source                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
installed-drivers=[{"driver-name" => "h2","deployment-name" => undefined,"driver-module-name" => "com.h2database.h2","module-slot" => "main","driver-datasource-class-name" => "","driver-xa-datasource-class-name" => "org.h2.jdbcx.JdbcDataSource","driver-class-name" => "org.h2.Driver","driver-major-version" => 1,"driver-minor-version" => 3,"jdbc-compliant" => true},{"driver-name" => "postgresql-9.3-1100.jdbc41.jar","deployment-name" => "postgresql-9.3-1100.jdbc41.jar","driver-module-name" => undefined,"module-slot" => undefined,"driver-datasource-class-name" => undefined,"driver-xa-datasource-class-name" => undefined,"driver-class-name" => "org.postgresql.Driver","driver-major-version" => 9,"driver-minor-version" => 3,"jdbc-compliant" => false}]  
[standalone@localhost:9990 /]

データソースを追加

driver-nameはJDBCドライバのデプロイ方法によって変わってくる

  • 方法1の場合、JDBCドライバのjarファイルの名前(postgresql-9.3-1100.jdbc41.jar)
  • 方法2の場合、jboss-cliで指定した名前(postgresql)
    data-source add \
     --name=TestDS \
     --driver-name=postgresql-9.3-1100.jdbc41.jar \
     --connection-url=jdbc:postgresql://localhost:5432/testdb \
     --jndi-name=java:jboss/jdbc/TestDS \
     --user-name=postgres \
     --password=***
    

接続のテスト

[standalone@localhost:9990 /] /subsystem=datasources/data-source=TestDS:test-connection-in-pool
{
    "outcome" => "success",
    "result" => [true]
}
[standalone@localhost:9990 /] 

データソースの情報を見る

[standalone@localhost:9990 /] /subsystem=datasources/data-source=TestDS:read-resource
{
    "outcome" => "success",
    "result" => {
        "allocation-retry" => undefined,
        "allocation-retry-wait-millis" => undefined,
        "allow-multiple-users" => false,
        "background-validation" => undefined,
        "background-validation-millis" => undefined,
        "blocking-timeout-wait-millis" => undefined,
        "capacity-decrementer-class" => undefined,
        "capacity-decrementer-properties" => undefined,
        "capacity-incrementer-class" => undefined,
        "capacity-incrementer-properties" => undefined,
        "check-valid-connection-sql" => undefined,
        "connection-listener-class" => undefined,
        "connection-listener-property" => undefined,
        "connection-properties" => undefined,
        "connection-url" => "jdbc:postgresql://localhost:5432/testdb",
        "datasource-class" => undefined,
        "driver-class" => undefined,
        "driver-name" => "postgresql-9.3-1100.jdbc41.jar",
        "enabled" => true,
        "exception-sorter-class-name" => undefined,
        "exception-sorter-properties" => undefined,
        "flush-strategy" => undefined,
        "idle-timeout-minutes" => undefined,
        "initial-pool-size" => undefined,
        "jndi-name" => "java:jboss/jdbc/TestDS",
        "jta" => true,
        "max-pool-size" => undefined,
        "min-pool-size" => undefined,
        "new-connection-sql" => undefined,
        "password" => "***",
        "pool-prefill" => undefined,
        "pool-use-strict-min" => undefined,
        "prepared-statements-cache-size" => undefined,
        "query-timeout" => undefined,
        "reauth-plugin-class-name" => undefined,
        "reauth-plugin-properties" => undefined,
        "security-domain" => undefined,
        "set-tx-query-timeout" => false,
        "share-prepared-statements" => false,
        "spy" => false,
        "stale-connection-checker-class-name" => undefined,
        "stale-connection-checker-properties" => undefined,
        "track-statements" => "NOWARN",
        "transaction-isolation" => undefined,
        "url-delimiter" => undefined,
        "url-selector-strategy-class-name" => undefined,
        "use-ccm" => true,
        "use-fast-fail" => false,
        "use-java-context" => true,
        "use-try-lock" => undefined,
        "user-name" => "postgres",
        "valid-connection-checker-class-name" => undefined,
        "valid-connection-checker-properties" => undefined,
        "validate-on-match" => false,
        "statistics" => {
            "jdbc" => undefined,
            "pool" => undefined
        }
    }
}
[standalone@localhost:9990 /] 

データソースの設定を変更する

connection-urlを変更してみる

[standalone@localhost:9990 /] /subsystem=datasources/data-source=TestDS:write-attribute(name=connection-url, value=jdbc:postgresql:\/\/localhost:5432\/testdb2)
{
    "outcome" => "success",
    "response-headers" => {
        "operation-requires-reload" => true,
        "process-state" => "reload-required"
    }
}
[standalone@localhost:9990 /] 

データソースを削除する

[standalone@localhost:9990 /] /subsystem=datasources/data-source=TestDS:remove
{
    "outcome" => "success",
    "response-headers" => {"process-state" => "reload-required"}
}
[standalone@localhost:9990 /] 

データソース一覧を表示する

[standalone@localhost:9990 /] ls /subsystem=datasources/data-source
ArticlesDS    ExampleDS     PostgresqlDS  TestDS        
[standalone@localhost:9990 /] 

XAデータソースの定義

WildFly8.0.0.Finalでやってみた

普通のデータソースと異なりconnection-url表記は受け付けられないようだ。[5][6]を参考に

XAデータソースの追加

batch
xa-data-source add \
      --name=JBatchXADS \
      --driver-name=postgresql \
      --jndi-name=java:jboss/jdbc/JBatchXADS \
      --user-name=postgres \
      --password=***
/subsystem=datasources/xa-data-source="JBatchXADS"/xa-datasource-properties=ServerName:add(value="localhost")
/subsystem=datasources/xa-data-source="JBatchXADS"/xa-datasource-properties=PortNumber:add(value="5432")
/subsystem=datasources/xa-data-source="JBatchXADS"/xa-datasource-properties=DatabaseName:add(value="jbatch")
run-batch

接続テスト

[standalone@localhost:9990 /] /:reload
{
    "outcome" => "success",
    "result" => undefined
}
[standalone@localhost:9990 /] /subsystem=datasources/xa-data-source=JBatchXADS:test-connection-in-pool
{
    "outcome" => "success",
    "result" => [true]
}

read-resourceで情報を見てみると、何故かxa-data-source-propertiesで設定した値がundefinedとかになっているのだが、XMLファイルを見てみると値が入っているし、接続テストもOKなので気にしない事にする

接続の障害検知

check-valid-connection-sqlを設定

[8]を見ると「試験以降は valid-connection-checker-class-name と check-valid-connection-sql のどちらかは絶対指定するように」とあるので、設定してみる。例はxa-data-source

/subsystem=datasources/xa-data-source=TestDS:write-attribute(name=check-valid-connection-sql, value="SELECT 1")

background-validation-millisを設定

[9]を見ると接続チェックを定期的に行わせることもできるみたい。設定はこんな感じか

/subsystem=datasources/xa-data-source=TestDS:write-attribute(name=background-validation-millis, value=60000)

validate-on-matchを設定

DataSource#getConnection()実行時に接続チェックをするか否か。AS7/EAP6からはデフォルトfalseらしい

/subsystem=datasources/xa-data-source=TestDS:write-attribute(name=validate-on-match, value=true)

idle-timeout-minutesを設定

障害検知ではないけど。プールの中で使われてない接続を破棄する設定。デフォルト30分。60分に延ばしてみる

/subsystem=datasources/xa-data-source=TestDS:write-attribute(name=idle-timeout-minutes, value=60)

備考

“non-JDBC-compliant”

デプロイするとこういう文言が出力されるのがすごい気になる

18:06:10,463 INFO  [org.jboss.as.connector.subsystems.datasources] (management-handler-thread - 3) JBAS010404: Deploying non-JDBC-compliant driver class org.postgresql.Driver (version 9.3)
18:06:10,464 INFO  [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-2) JBAS010417: Started Driver service with driver-name = postgresql

参考文献

  1. CLI Recipes - JBoss AS 7.1 - Project Documentation Editor
  2. java - How to check datasource in JBoss? - Stack Overflow
  3. wildfly/quickstart · GitHub
  4. “non-JDBC-compliant”? - Community - JBoss
  5. WildFlyにXA DataSourceを登録する
  6. Creating XA Datasource from the CLI fails | Community
  7. JDBC XAデータソース - nekopの日記
  8. JBoss ASのデータソース設定 - nekopの日記
  9. JBoss ASのデータソース障害検知 - nekopの日記