2009年11月20日 星期五

Tomcat JMX 設定

要啟用 tomcat jmx 管理需在 setenv.sh 加入一些參數

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote \
   -Dcom.sun.management.jmxremote.port=8888\
   -Dcom.sun.management.jmxremote.authenticate=false\
   -Dcom.sun.management.jmxremote.ssl=false\
   -Djava.rmi.server.hostname=your_remote_hostname_or_ip"

在 tomcat 手冊中並未說明 -Djava.rmi.server.hostname 如未加入這段參數遠端的 jmx client 會致使遠端使用者無法連線成功。
也可參考 Monitoring Tomcat with JMX這篇文章。

2009年9月18日 星期五

javadoc 語法備忘

javadoc -encoding MS950 -docencoding UTF-8
         -d target/javadoc
         -sourcepath src/main/java
         -subpackages base.steven.example

說明

  • -encoding source code 的編碼格式
  • -docencoding 文件的編碼格式
  • -d 輸出的目錄
  • -sourcepath 指定原始碼的路徑
  • -subpackages 以遞迴的方式處理子套件,如果不指定則處理一層

2009年9月1日 星期二

JBoss AS Cluster 設定

在 JBoss server 上開啟 cluster 非常容易,本文章是用來記錄一些備忘。


假設有兩台 AP Server S1、 S2 其相關環境如下


s1 ip 192.168.0.28/24


S2 ip 192.168.0.140/24



在 JBoss AS 下指令如下
run.sh -c all -g CLUSTER_NAME -b IP_ADDRESS -Djboss.mesaging.ServerPeerId=
SERVER_PEER_ID

說明



CLUSTER_NAME : 指 cluster 的名稱,用以區隔不同的 cluster

IP_ADDRESS : 指JBoss AS 綁定 ip 位置

SERVER_PEER_ID : 設定 serverPeerId,預設都會是0,必須指定不同的數字用以區隔。否則啟動第二台 AP 時會引發錯誤


如 run.sh -c all -c c1 -b 192.168.0.28 -Djboss.messaging.ServerPeerId=1

如 run.sh -c all -c c1 -b 192.168.0.140 -Djboss.messaging.ServerPeerId=2


上述兩個 JBoss AS 綁在不同的 IP 上,具有相同的 cluster 名稱, 不同的 ServerPeerId。


jboss.message.ServerPeerID 參數設定以可以設定在 JBOSS_HOME/server/all/deploy/messaging/messaging-servie.xml檔中,修改屬性 ServerPeerId 的預設值即可,如此就不用每次啟動時都指定 serverPeerId 值。


如果要提供 Web cluster 的功能,另外需要設定 Web container 的 server.xml 設定檔, 在JBOSS_HOME/server/all/deploy/jbossweb.sar/server.xml 中 Engine tag 中加入 jvmRoute="node1" 這樣屬性,用以使前端的 apache server 用以辦視是那台 AP 在服務現的連線。



前端 HTTP Server 設定



除了設定 cluster 外尚設定前端 apache server 使其能負責分流的工作。
在這邊我們採用 apache mod_proxy_ajp 模組來擔任 load balancer 的角色
所以在 apache server 必須要 load 進 mod_proxy.so、 mod_proxy_balancer.so、mod_proxy_ajp.so 等3個模組

apache 的設定檔如下



接下來我們寫一個應用範列

web.xml



要注意要設定 <distributable/> 這個 tag 否則 session 不會進行複製。


jsp 內容 :



連線後我們可以看到 header

因為有設 jvmRoute 的關系,連線請求會送至上次所服務的主機,所以我們會看到主機名稱都相同。
我們可以關閉目前服務的 JBoss Server,這時我們可以看到網頁由另一主機繼續提供服務。


透過 Balancer Manager 來關閉與設定主機連機


可以觀察雖然關閉與其中主機連線 counter 的號碼還是繼續進的。
主機1

主機2

或者也可透過 mBean 來觀察

連線方式:開啟 JConsole 以遠端方式連線

service:jmx:rmi://your_ip/jndi/rmi://your_ip:1090/jmxconnector

mBean 路徑: jboss.web:type=Manager,host=localhost,path=/your_contextName


2009年8月20日 星期四

用Java 寫 Web Service(2)

佈署 Web Service 除了在 SE、 Web Container 的環境底下外還有直接佈署在 EJB Container 中。佈署在 EJB Container 也有兩種型式:1.POJO、2.Session Bean 兩種方式



POJO 方式



撰寫一個寫單的 Java Bean



Java Code 的部份很單,但佈署方 EJB Container 的方式則各家不同


Jboss AS


在 Jboss 的境底下須包成 War 檔,並以 Servlet 的式來提供 Web service



佈署完畢!雖然是純 Java Bean 但還是可以當成 Servlet 來佈署。雖然有點奇怪,但在 Jboss 上行得通。


Glass Fish


在 Glass Fish 佈署 Web Service 是最方便的,包裝成 War 檔後直接佈置到 Server 上即完成。完全不須額外的設定是取方便的佈署方式。但這樣的佈置方式也僅限 Glass Fish



EJB Session Bean


必須撰寫 Session Bean, 其實也不難,僅要在 Java Bean 上增加一些 EJB 有關的 Annotations




包成 Jar 檔即可。EJB Session Bean 的佈置方式是 EJB 3.0 的標準,適用於不同 EJB Server 是最理想的佈署方式



2009年8月18日 星期二

用 Java 寫 WebService (1)

既然是用Java 寫 Web Service 就不是 Top-Down(Contract first) 的寫法,主要是透過 jax-ws api 來寫,當然 jax-ws 也可用於 contract first 方式寫。


雖然以 jax-ws api 來寫 web service 但還是產生方式



最簡單的 Web service



在 Java SE 6 的環境下即可寫一個簡單的 pojo 即可產生 Web Service


一個 pojo Web Service



Web Service 發佈程式



一個用 Java 寫的簡單 Web Service 即完成



佈署在 Web Container 上



可否將 Web Service 也佈署在 Web Container 上呢?可以的(非標準規範),但必須加上額外的 jar 檔,在 maven 的 pom 檔上須加上



另外在 還須在 Web.xml 檔中加上額外的 Listener 和 servlet 設定



WSServlet 用來處理所有的 Web Service, 至於實際處理 Web Service 部份則定義在另一張設定檔 sun-jaxws.xml 中





該設定檔中定義了兩個 Web Service 分別對應到兩個 Web Service 實作


比較可惜的是,在 Web Container 的環境中目前尚未有標準的規範。目前還需額外設定。



2009年8月3日 星期一

XML API 比較測試

比較幾個常用的XML API 的寫法與實做,並測試較能


我們以一份 Google map 的 kml 檔來做我們 parse 的對象




StAX




DOM API




XPath API




JDOM API




DOM4J API






幾種 API 測試下來的結果 StAX 的較能的最好的約 1/5~1/7 的時間內可完成;
dom、 jdom、 dom4j、 XPath 較能差異不大,個人的偏好以xpath方式來編寫,但也是幾個 API 中效能最差的一個