Skip to main content

Posts

Showing posts from October, 2012

Others - 建立從GitHub裡面抓取專案

這是個小小的跟J老板沒關係的番外篇,為什麼要寫哩?
因為國外的demo 大部份都是放在github上面,所以就要寫一下怎麼使用.

這裡要抱歉一下,我可能不會像以前一樣,一步一步教,因為這個部落格不叫做Christina 的 GitHub, 如果你去google 一下,就可以找到像山一樣多的強人寫的教學.

1. 請到 GitHub 註冊一個帳戶. 然後依照你的OS去安裝與設定

Mac setup gitWindows setup gitLinux setup
2. 安裝完之後,首先,先到某個你想要建立GitHub 儲存庫的Folder路徑 ,然後打入:
Christina:jbossdemo christina$ git init Initialized empty Git repository in /xxx/christina/jbossdemo/.git/
就可以去教學的連結去抓專案下來了, 我的習慣是去每個地方先複製一份下來到我的 local之後,才從Eclipse 去指他 (這是跑Demo的時候拉,如果你是專案開發,請直接就從你的repository裡面import 就好!)

它的指令很簡單,就是git clone 你的repository 位置
Christina:jbossdemo christina$ git clone git://github.com/weimeilin79/xxx-project.git
3. 之後就可以打開JBoss Developer Studio了,首先,因為GitHub的 plugin不是內建安裝的,所以要先去 Help的 Install New software

4. 選擇JBoss Developer Studio 5.0 Updates, 在搜尋欄位打 git 選擇 EGit 安裝. 然後重開 JBDS.

5.重開了以後,去File 下選擇 import project, 之後選擇 Project from GitHub.

6.因為剛剛有複製一份到本機,所以選擇local 剛剛Clone的位置
加入成功後會顯示如下

7.按下確定後就import成功拉.

以上.

JEAP 6 - 安裝模組 modules

這是今天有人問我的問題~
因為先前已經裝了很多次,很多次,我以為大家都會了說~
原來都迷有好好的閱讀之前的東西~好桑心,好桑心啊!~>x<~

以前在JBoss EAP 5我們有一些共用的模組,都會請你把它放在 $JBoss_install_path/common/lib 下,不然就是使用shared library.. 自己去調整scope.

JBoss EAP 6 的 Class Loading與先前不同,等我有空再寫。

先來講如何安裝module(模組),(小聲地說:截至目前為止,這是第三遍囉!)

當然,這次先自己寫一個JAR檔,
我就寫了一個,christina.jar

它什麼都沒有,就只會跟你說hello~ (你可以按這裡,下載,老規矩,請把txt的副檔名去掉)
當然,如果你有自己的jar檔,請用自己的!

請到$JBOSS_HOME/modules 下建立folder.
我建立一個demo/christina/main ,把我的jar檔放進去,並且建立一個 module.xml











module.xml的內容如下
之後,要把這個模組share 給整個JBoss 的 AP看見的話(整個JBoss 就只有一個instance),請在你的standalone or domain 的xml 加上global variable
falsetrue 寫一支WAR 來呼叫這個模組,(你可以按這裡,下載,老規矩,請把txt的副檔名去掉)


可以使用這個模組拉~!







當然,如果你不想要把這個模組export出去,只想要給某個WAR檔使用,那上述方式就不太適合了,也可以用下列方式。
在你的WAR 下的 META-INF/MANIFEST.MF 中加入depency就可以了!(你可以按這裡,下載,老規矩,請把txt的副檔名去掉)

MANIFEST.MF設定如下:

Manifest-Version: 1.0 Dependencies: demo.christina 另外,有人問,如果是在Domain環境下,那module是每個host 都要建立嗎?答案是YES! 每一個獨立的Host 都要放喔!





JEAP 6 - JBoss 加入SSL

雖然我不知道為啥有人想要知道... 因為通常都是用Apache 在最前面不是嗎?
應該是對Apache 加SSL不是JBoss 吧?
如果連Apache 跟 JBoss 之間都要加密,這樣效能不會很差嗎?@o@
或者有誰可以來解答我的疑問。Anyway,

要在JBoss 上提供 SSL,請自己弄一個Key Store來! (別人給的,自己發的都可以!)

PS. 不會發keystore 可以參考我的做法。
執行JDK 內建的keytool 
keytool -genkey -alias jboss -keyalg RSA -keystore jeap6.keystore -validity 3650
如下:

1. 先把憑證keystore 放到一個JBoss 可以看見的資料夾,
我是在 $JBoss_home 下建立一個keystores 的目錄。把憑證放進去。

2. 看你是用Standalone 還是 domain mode, 到 standalone(-*).xml 或是 domain.xml 下找到jboss:domain:web:1.1 這個Subsystem.
原先,你應該只看見有個 http 的 connector
...... 在下面加上新的 https connector, 
https 的 Connector 設定,加上secure = true 是為了讓系統在call 
的時候會回傳true
socket-binding default 是 8443

ssl 上的設定,
password 設定在keystore的密碼
key-alias 設定在keystore的 alias 名稱,default 是 jboss
certificate-key-file 是放keystore的位置

放置上去後,重開JBoss, 就可以試試看了!
https://localhost:8443/
(如果你是自己發的憑證,第一次瀏覽器會顯示不安全。因為是自己發的關係,請不用在意。)




至於要如何幫Apache httpd 加上ssl, 可以參考以下的網址喔!
http://www.digicert.com/ssl-certificate-installation-apache.htm

JEAP 5&6 - 啓動時自動載入properties的檔案

通常如果要載入一個.properties的檔案,應該盡量不要放在System.getProperties() 因為這是提供給整個JVM instance系統在用的變數。

我的建議是properties的檔案,還是另外放比較好拉!然後再讀進來。
讀取的方式,有好幾種,(如果,properties檔案名稱叫test.properties,)

1), 用load Properties的方式放進來

Properties instance = new Properties(); instance.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("testprops.properties")); String value = instance.getProperty(keyName);
2), 用Resource Bundle的方式放進來(比較推薦這種)
ResourceBundle resource = ResourceBundle.getBundle("testprops",locale); resource.getString(keyName)
在JBoss EAP 5

只要把properties的檔案放在$JBoss_INSTALL_Path/server/$profile/conf 就可以直接在上述的地方直接寫上properties的名字就好。

在JBoss EAP 6

最簡單的方法就是將整個路徑指定到  FileInputStream 的位置,
InputStream inStream = new FileInputStream("/opt/config/testprops.properties"); Properties instance = new Properties(); instance.load(inStream);
但是這樣上述直接去讀取config下properties檔案的方式就不能用了。要使用ResourceBundle 就需去設定JBoss 啓動時自動去讀取的模組。
設定模組的方式很簡單,

1. 請先到$JBoss_INSTALL_PATH 下的modules下建立路徑 conf/mai…

JEAP 5 - Class Loading

常常遇到在從其他AP Server搬家到J老闆小朋友們都會因為Jar檔的衝突,很慘烈的把檔案砍來砍去。不停的咒罵J老闆。

其實。。你還不夠瞭解它。一旦你知道了,也許就不會這麼痛苦了。
JBoss 的Class Loading 分成兩個對程式人員比較大的問題,一個Loading的順序,另一個則是isolation, 我個人認為,isolation造成的問題比順序更為嚴重。
先來看看JBoss EAP 5 的Loading方式,
1. JBoss 啓動之後,會先將一些基本的檔案(放在JBOSS_INSTALL_PATH/jboss-as/lib下)讀進JBoss 這個大容器裡面。再由這些檔案負責開始真的將部署的檔案Loading 進 JBoss 身上了。


2. 接下來,就是每個WAR的檔案。根據J2EE的規範,每個WAR檔都不能看見對方的檔案,所以每個WAR檔都是獨立的個體,分別被讀入JBoss大容器中。
3. 而後就是EAR裡面的 EJB 與 lib檔案,而這個大容器裡面,就只會有一份,大家一起共用來看。如果遇到重複名稱的class, 那就會以最先loading進入的為主。

4. 讀取全域的資源,如,部署在deploy目錄下的EJB.這些同樣都只有一份會存在於JBoss 這個容器中。


5. 最後讀進 EE 跟 JDK 的內容。 以上是讀取的順序。
現在來講講isolation,所謂的isolation是指你的程式在JBoss這個大容器的能見度。 以JBoss default 的設定來說,唯一會對其他人封閉的部分只有WAR檔。
以"蘋果"這個Class為例(PS, 我不是果粉,我不是果粉!) 如果我是把它放在WAR裡面,那JBoss 這個Container就會有兩個"蘋果"的instance, WAR-1 會讀到蘋果A,WAR-2 會讀到蘋果B.
但是,如果這個蘋果是放在EAR 的 lib中,因為EAR檔是只會存一份在 Container裡面,所以最後一個被load到的EAR建起來的蘋果,就是大家以後共用的蘋果了



所以,以上就是isolation, 看,所有東西換成蘋果就多麼的簡單啊 (哇哈哈,下次用香蕉好了) 當然拉,如果要解決這些問題怎麼辦?
J老闆以他的彈性著稱,如果連這個都不能解的話,那就太遜了! (魯夫是橡膠人,所以他也…

JEAP 6 - 使用TCP做Cluster

好吧,我知道JBoss Default 的設定就是UDP,
為啥還要用TCP,因為有環境就是有這個需要.....

在新的J老闆裡面,負責做Cluster的兩個主要大模組就是
JGroups 跟 Infinispan
而控制Cluster裡面的node跟選擇他們要溝通的方式就是JGroups.

所以,不管你今天用的是Standalone或是domain,
只要找到jgroups的subsystem修改,就OK了,如下:

1. 將default-stack 由 udp 改為 tcp

.....
改為 tcp
..... 2. 將原先使用MPING 的設定暫停(先砍掉)
..... 3.加上TCPPING的參數
..... 172.16.1.77[7600],172.16.1.79[7600]202000 其中

initial_hosts =所有你想要加入的機器IP與PORT的號碼
num_initial_members = Cluster最多加入多少台機器數量
port_range = 你要搜尋機器可以Ping到port 的範圍
timeout = 設定timeout時間(毫秒ms)

這樣就完成拉!很簡單吧。





JEAP 6 - 建立Red Hat Linux 的Service

怎麼可以只做Windows, 沒有Linux咧?
以下為Red Hat Linux 的範例:

安裝JBoss, 這個我就不教了,不知道怎麼做的請參考以下的文章。

在官方文件中,它說建立的shell 已經寫好了,但是..這絕對不是事實(哭....)
他只有寫好standalone 的,而且還照他寫的還不能用哩~
所以,小姐就很佛心地改好了,隨便寫的,大家將就用吧...

請按這裡下載改寫的jboss-eap-linux.sh (下載後請幫我rename 成 jboss-eap-linux.sh)
下載後打開,

可以看到它會load 一個jboss-as.conf, 我現在是寫死到原先它提供的位置上
/opt/jboss-eap-6.0/bin/init.d 下

各位可以看你們想要放在哪裡,修改一下...
改好後,各位請在你剛剛設定的檔案位置修改你的jboss-as.conf
(檔案可以從你的JBoss安裝路徑下的/bin/init.d/jboss-as.conf copy過來)


要設定的地方有,

1. 啟動JBoss的User 名稱

JBOSS_USER=root

2. 設定JBOSS_HOME

JBOSS_HOME=/opt/jboss-eap-6.0

3. 設定要啓動的是domain 還是 standalone

JBOSS_MODE=domain

4. 設定要讀取的xml config檔案

JBOSS_CONFIG=domain.xml


這樣檔案就放置完成了,到/etc/init.d
執行 chkconfig --add jboss-eap-linux.sh 


接下來就可以開啓服務,然後就完成了!