Skip to main content

Posts

Showing posts from August, 2012

JEAP 6 - HornetQ 的設定

感謝雪魚一哥幫忙今天早上的Webinar,
在台灣最熟JBoss Messaging 應該就是他了
=========================================

HornetQ 是一個MOM (Message-oriented Middleware) 幫忙管理messaging的系統平台。
聽起來可能很陌生,但是如果我講到 Queue 與 Topic 可能就會知道拉。

設定方式,以後再介紹Cluster.
這次先已開發為主的Standalone 方式建立。
(如果你沒有安裝過JEAP 6 Standalone請到這裡參考)

1. 確定你使用的模組是到 $JBOSS_INSTALL_PATH/standalone/configuration/standalone-full.xml
因為我們需要用到messaging 的subsystem





所以,請將$JBOSS_INSTALL_PATH/standalone/configuration/standalone-full.xml rename 成 standalone.xml

2. 啟動Standalone Server
到$JBOSS_INSTALL_PATH/bin/ 執行 standalone.sh



3. 到http://localhost:9990 去,登入後,到Profile 下,的Messaging 下的 Destination. 左邊有個default,按下view 進入



按下ConnectionFactory 裡面內建已經有了2 個 ConnectionFactory,一個是在同一個VM instance 可以取用的,一個是Remote 可以 lookup 到的 ConnectionFactory。
看到裡面使用connector 都是 netty, 但是如果你的message size 都很小的話,建議使用netty-throughput。因為它的可以batch delay (batch 一段時間 這對小的msg 的throughput 會有很好的影響),direct-deliver也設定成false .





4. 建立queue的使用者, 每個queue 要存取,都必須要有id 跟 密碼認證
到$JBOSS_INSTALL_PATH/bin/ 執行 add_user.sh


Lin-C…

JEAP 5 - Shared Library設定

通常在JBoss 裡面,如果有遇到不同的Application 需要共用一些JAR的檔案,我們都會請他放在 JBOSS_INSTALL_PATH/server/$PROFILE/lib 下。

這種Loading 的方式,會將EAR 與 這些library 分別Load 近來。

因此,load 之後,兩個 EAR 都會對應到同一個 Load 進來的Library的instance.


使用者希望可以把這些jar檔放在一個位置,以後只要更新一個地方,其他對應的EAR 只要look up 這些更新得檔案就好了。

通常,一般的Class 這樣子就好了。因為大部份的API 在同一個Server instance 下是可以共用的。這樣也比較省memory。




可是這位客戶,它的Library裡面因為會需要hold 住每個EAR instance 給它的值,所以是無法提供共用的。

因此,他希望每個Library 都存在每個獨立EAR isolation 的裡面,不要互相影響。


照現行的deploy的做法是沒辦法做到 isolation 的。

唯一的方法就是在JBoss deploy 的時候去定義,讓他在load EAR 的時候也去look up 設定的library 位置。

所以,必須要客制化一個deployer 讓它可以在EAR Level 的時候lookup 檔案,做到這一層的isolation.

在網路上找到一個Sample Code, 它的做法是extend JBoss 原有的UrlIntegrationDeployer,這支程式會把程式掃到的URL File load 進去。 所以要改的工,變得簡單了。

1. 先建立一個JMX Bean, 指定需要額外讀取的檔案。
2. 找一個可以實作isIntegrationDeployment的method. (PathUrlIntegrationDeployer)

接下來只要將檔案放到JBOSS_INSTALL_PATH/server/$PROFILE/deployer 下,修改裡面loading 的位置就好囉!


因為這裡不能放檔案下載,所以有需要請跟我要吧!


另外,還有EAR isolation 的修改。
如果想要每個EAR 的 domain 獨立的話,JBOSS_INSTALL_PATH/server/$PROFILE/depl…

JEAP 6 - JBoss 的 logging

因為有人問,所以就花時間寫了個Sample,既然寫了,就PO上來吧。

我發現有很多人不知道Java EE 6 是不需要web.xml 這個檔案的, 所以在這裡要特別注明一下,因為有人在開發全新的專案時,(並不是migration) 還是會不由自主地放進這個檔案,當然,如果你有特別需要設定當然是可以,但若只是為了定義servlet, filter 這些,只要善用新的Annotation 如 @WebServlet, @WebFilter, @WebInitParam, @WebListener 等... 不需要 web.xml 了!

但這不是重點,這篇的重點是因為發現有人會把JBoss server 提供的common log 與 log4j 的 log 分不清楚... 文章中提供一些範例給大家使用。想要完整的sample code 再來跟我要吧。

首先,當然要先講JBoss 的logging 機制。畢竟這個論壇是J老闆的場子 XD

JBoss 的logging 機制

使用JBoss logging 的機制有個好處,

1. 你不用再去啦哩拉匝的找log4j的jar檔,
2. log 控制可以放在Application Server 上面設定,不需要另外寫xml 或是properties
3. logging 可以隨時調整,不用重開伺服器

第一,先 import org.jboss.logging.Logger;
第二,開始定義每個Class 的 寫 log 的 logger,


然後就可以開始寫log了!
至於設定的部分,可以到Admin Console (http://localhost:9990/console)
所有的sub system 都是在 logging 的 subsystem 設定的。

第一,我們要設定log 要用什麼方式寫入(handler 設定),今天要把log 寫到跟system.log 同一個地方,而且,要每天切一個新檔案。
然後就可以加入你的package 路徑。
我希望所有 com.omni 都寫到剛剛設定的檔案中。

以上JBoss 就設定完畢了!非常簡單吧~也可以隨時去改一下log level.

Log4J 的logging 機制

Log4J 是大部分人的選擇,選擇它的原因不外乎是因為他好用,
而且不受Application Server …

JBoss Messaging - Client 無法連結Queue Server

今天有個客戶遇到這個問題,就順便PO 上來,
Exception 的內容如下
Caused by: java.lang.IllegalStateException: Cannot find object in dispatcher with id xxx-xxxxx-1-xxxx-xxxx-xxxx     at org.jboss.jms.wireformat.SessionSendRequest.serverInvoke(SessionSendRequest.java:101) at org.jboss.jms.server.remoting.JMSServerInvocationHandler.invoke        (JMSServerInvocationHandler.java:157) at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:930) at org.jboss.remoting.transport.socket.ServerThread.completeInvocation        (ServerThread.java:791) at org.jboss.remoting.transport.socket.ServerThread.processInvocation        (ServerThread.java:744) at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:586) at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:234)  at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:216) at org.jboss.remoting.Client.invoke(Client.java:2034) at org.jboss.remoting.Client.invoke(Client.java:877) at org.jboss.remoting.Client.in…

JEAP 6 - 使用mod_cluster 連接JBoss做Load Balance

先前版本的JBoss 大多用 mod_jk, 但是這個版本的J老闆已經開始支援更聰明的load balance 機制,mod_cluster.
mod_cluster 有什麼好處咧?他可以去判斷server的狀況來決定request 要導到哪一台server 上,如CPU的loading 啦~session 的數量等等。而先前的只有亂數丟,跟輪流丟這兩種方式而已。

在開始設定前,請先確定你的JBoss Cluster 環境已經建立起來了。
如果沒有,請參考先前的文章

1. Standalone 啟動 Cluster
2. Domain 啟動 Cluster

以上兩種選一個即可!
=======================================================

首先,請自己去Apache 的官網下載 Apache 的 HTTP Server, 當然,如果你是Red Hat Enterprise Linux 的客戶,那應該內建就會有了。
如果你是JBoss Enterprise 的客戶,這時就幸運拉,因為安裝的紅帽都幫你準備好了!可以到JBoss EAP 6 的下載網頁裡面,下載最新的HTTP Server!


網路上到處是文章,這裡我就不再贅述Apache 的安裝與使用方式了。
首先,先確定你的 HTTP_INSTALL_PATH/modules 下,有這些so 檔案, 如果沒有,請自己找!當然如果你是JBoss Enterprise 的客戶,一樣可以粉方便地去下載!

請找 :jboss-eap-native-webserver-connectors-xxxxx

mod_proxy_cluster.so
mod_slotmem.so
mod_manager.so
mod_advertise.so








==================================================
Apache 設定
==================================================

開始設定config 檔案。
請到HTTP_INSTALL_PATH/conf 下,打開 httpd.conf
設定去讀取剛剛下載的檔案。


LoadModule proxy_cluster_module modules/mod…

JEAP 6 - Domain 啟動 Cluster

又拖稿了.... 請不要催促我咩,因為公司的事情很多!
所以我絕對沒有偷懶噢!

要啓動Domain 的Cluster 很簡單!
只要先學會如何將Domain 啓動的話!如果你不知道,可以先參考之前的文章!
這篇算是第三集了~如果你是從這篇文章開始的話,記得先回前兩個看噢!

這次的做法會將main-server-group 做成一個Cluster (下圖的Cluster One),
other-server-group 做一個Cluster (下圖的Cluster Two),
但是third-server-group 就還是保留一臺!



首先,要將main-server-group 與other-server-group 設定為 Cluster,
跟之前Domain 起動是一樣的!只是Profile 的部分,由 default 改為 full-ha 或是 ha 即可!
當然使用的socket 也要改成是 full-ha-socket 或是 ha-socket.

所以,到第一臺,也就是設定domain.xml 的地方,
打開domain.xml 到設定server-group 的地方,將 main-server-group 與 other-server-group 的 profile 改成 full-ha




接下來,因為Cluster 不只是web 的部分,還有HornetQ 所以還要修改一下設定才不會出 error log. 一樣在domain.xml中, 看自己是用哪一個profile. 如果你是用 ha 請看 ha profile 底下的,我的sample 是 full-ha 所以我就修改 full-ha profile 下的 jboss-messaging subsystem.



接下來這個步驟是optional, 也就是不一定要做,但是如果你之後要用apache 去做load balance 的話,請記得設定每個server 一個獨立的instance id.
設定方式如下:
在你的 profile 下的 web subsystem 上增加instance-id 的設定


<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host&…