顯示具有 java 標籤的文章。 顯示所有文章
顯示具有 java 標籤的文章。 顯示所有文章

2010年10月4日 星期一

SLF4J 使用說明

SLF4J Log 層級

SLF4J 提供 ERROR、WARN、INFO、DEBUG、TRACE 等5種層級。

一般使用上建議 logger 層級的使用 。

  • ERROR 為系統發生錯誤時的輸出訊息。
  • WARN 當系統發生不正常或非預期結果的訊息,其嚴重度不似 ERROR 層級。
  • INFO 輸出一般的資訊、輸出系統目前資訊、執行訊息,可做為平時記錄或監控使用。
  • DEBUG 除錯用的資訊,提供更詳細的資訊,利於工程師處理問題,會影嚮系統效能,不建議在產品環境中開啟,適合用於開發階段或問題除錯使用。
  • TRACE 比除錯更細微更詳盡的資訊內容,但影嚮效能甚鉅。

設定檔中 Logger 輸出層級

可在設定檔中設定 Logger 輸出的預設層級,以 LogBack 為例,若未指定預設的 Logger 層級為 INFO。

可依需求設定 Logger 的預設層級,各別套件或特定類別的輸出層級。

  • OFF 停止 logger 輸出任何資訊
  • ERROR 只輸出 Error 層級的錯誤訊息
  • WARN 輸出 Warn 層級含以上的訊息
  • INFO 輸出 Info 層級含以上的訊息
  • DEBUG 輸出 Debug 層級含以上的訊息
  • TRACE 輸出 Trace 層級含以上的訊息
  • ALL 輸出所有的 Logger 系統訊息

在 Class 中使用 logger 物件



在 JSP 中使用

<%-- 使用 jsp 的宣告實體變數 --%>
<%! private final Logger logger = LoggerFactory.getLogger(this.getClass());%>
<%
 //在 jsp scriptlet 中使用
 logger.info("username = {}", request.getParameter("username"));
%>

與舊有的 JCL (Jakarta Commons Logger) 的比較

Commons logger 的語法

JCL 在輸出記錄前必須先判斷目前 Logger 系統的層級再做 Log 訊息的輸出,以確保 Logger 的效能。

if(logger.isDebugEnabled()) {
  logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}

SLF4J 的等同語法

SLF4J 的寫法比較直覺,無須再去判斷目前的 log 層級,直接指定 log 層級輸出。

logger 的輸出與 JCL 不同,應採用參數的方法做輸出,減少不必要的字串組合所造成的效能秏損。

logger.debug("Entry number: {} is {}",i, String.valueOf(entry[i]));

參考資料

2010年2月3日 星期三

Google Collection Api

google code 上一組好用的 api 可以用來取代 apache commons collections api
google collections 提供一些好用的建構式及好用的方法,
可以參考以下範列

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 中效能最差的一個

2007年9月10日 星期一

Jboss webservice for 4.2.1

Web service change in 4.2.1



建立一個Webservice



打包成myWebservice.jar 後,連線至server;



http://serverName:8080/MyAgeService/MyAge?wsdl



url 的預設值和4.0.5有所差異請注意