- 下載 jboss-6.0.0.20100721-M4, 直接解開找一個路徑放就可以了.
- 設定環境變數 JBOSS_HOME 到 ${JOSS_DIR}, 啟動的時候會用到.
- 不建議放在 "c:\Program Files" 下面, 因為會跑不動. 大概目錄有空格就會跑不動.
- ${JBOSS_DIR}\bin\run.bat , 跑得起來 沒有任何錯誤. 就是已經開起了.
- http://localhost:8080 看得到就是成功了, 選用 admin console.
- admin/admin 就可以看到 jboss ap server 的管理介面.
Session Bean 測試
測試過後, 基本上可以 在glassfish and weblogic 上面跑得簡易Session, 都是可以正常運作.
Message Driven Bean測試
- 1. 設定 ConnectionFactory 和 Queue 都可以透過 admin console. 只是 我不知道設定檔存在哪邊. 從${JBOSS_DIR}\server\default\deploy\hornetq 裡頭看不出來, 透過admin console 的設定存放在哪邊. 所以後來我統統用自己去修改 ${JBOSS_DIR}\server\default\deploy\hornetq 的所有設定檔.
- 2. 佈署 MDB(Message Driver Bean). 把glassfish and weblogic 都會過得 MDB 透過 admin console 放去, 就出現錯誤啦 . 變裝前
- 事情不是這樣簡單的, 繼續下去吧. 拿去deploy 還是會繼續發生問題的. 錯誤訊息一直跟我說user=null,問題點看了很久,還是看不出來問題出在哪邊. 所以, google 大神請了老半天, 有看沒有懂. 怎麼辦, 老大交待要選一個, 還要能夠用的.
只好下在hornetq 來看摟, ${hornetq}\example 裡面有很多範例可以慢慢欣賞. 就直接切進去 ${hornetq}\example\javaee\ 來找答案了. 看了老半天, 也沒發現不一樣的. 找兩天, 幾乎沒有看到任何文章或者解釋可以說明的.
就在要放棄的時候, 想說那看一下 ${hornetq}\example\jms. 發現一個怪現象, 幾乎每一個jms example 的設定檔裡面, 都會多出一個 hornetq-users.xml. 好奇殺死貓, 打開來看, 哇老天壓.....
<configuration xmlns="urn:hornetq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:hornetq /schema/hornetq-users.xsd">
<!-- the default user. this is used where username is null-->
<defaultuser name="guest" password="guest">
<role name="guest"/>
</defaultuser>
</configuration>
有沒有看到 哪行註解.... the default user. this is used where username is null 就直接把檔案放進 ${JBOSS_DIR}\server\default\deploy\hornetq. 再把 server 重開, 安裝測試檔. 哇...過了.... 還我兩天的青春壓...
很多事情高興一天就好了, 沒想到我高興不到半小時, 就繼續陷入苦戰了. 可以安裝上AP 不代表可以正常的跑. 安裝上去以後, 總是要測試一下 Queue 到底可不可用, 能不能正常作用. 就寫了一個簡單的 Session 做為 Message Provider, 測試一下 到底資料可不可以透過 Queue 送給 MDB. 安裝後, 呼叫Session送資料到 Queue. 沒想到 console 傳回了一個要命的error.
[STDERR] Caused by: java.lang.ClassNotFoundException: org.hornetq.integration.transports.netty.NettyConnectorFactory from BaseClassLoader@12e
bf9a{vfs:///C:/jboss-6.0.0.20100721-M4/server/default/deploy/TestQueue.ear}
看到這樣的錯誤, 第一個反應是不是少了那一個 jar 沒有放進去 server lib 裡面. 不過沒有到底壓, Jboss 6 已經是內建 hornetq , 不應該會少東西壓. 網路上查了一下, 也看到他們說已經把改補的在五月補上去了壓, 我是抓七月的檔壓. 又花了一天在找資料作測試. 還是一樣徒勞無功. 那就休息吧... 不要在做測試了
噹噹, 兩天過去了. 不行都已經奮戰了五天了, 不能這樣就放棄 Jboss. 把org.hornetq.integration.transports.netty.NettyConnectorFactory放進 google 找看看好了. google 找到的第一文件 The HornetQ Team Blog: Understanding Connectors & Acceptors 看起來跟解問題沒有關係, 但是列在下面的幾篇又都已經看過了, 反正沒希望了, 就看看 Connectors and Acceptores 有何差別也好學一下人家的設計好了.
好學不倦的人就是有福了, 文章就直接先解釋Acceptores and Connectors 在的作用. 接下來就講到一個東西 "HornetQ defines 2 types of acceptor/connector : invm and netty". 嘿嘿這解釋就讓我瞭解了, 之前再看設定檔老是看到 netty 不知道怎樣使用的, 沒想到 invm 才是另外一個重點.
我的測試機上面, AP 和 hornetq 是同一台機器, 而且 hornetq 是設定 embedden 模式, 所以ap and hornetq 會長在同一個vm. (hornetq 還有local and remote mode, 就是一個跟 ap 會同生死但是是分別兩個vm , remote就不會跟AP同生死, 當然也不是在同一個vm. ). 所以按照文章的講法, 我猜想是我的設定檔指定錯connectors 了, 回去翻我當時的設定檔 hornetq-jms.xml.
<connection-factory name="NettyConnectionFactory">
<connectors>
<connector-ref connector-name="netty"/>
</connectors>
<entries>
<entry name="/ConnectionFactory"/>
<entry name="/XAConnectionFactory"/>
<entry name="jms/ConnectionFactory"/>
</entries>
</connection-factory>
<connection-factory name="InVMConnectionFactory">
<connectors>
<connector-ref connector-name="in-vm"/>
</connectors>
<entries>
<entry name="java:/ConnectionFactory"/>
<entry name="java:/XAConnectionFactory"/>
</entries>
</connection-factory>
作個實驗修改後
<connection-factory name="NettyConnectionFactory">
<connectors>
<connector-ref connector-name="netty"/>
</connectors>
<entries>
<entry name="/ConnectionFactory"/>
<entry name="/XAConnectionFactory"/>
</entries>
</connection-factory>
<connection-factory name="InVMConnectionFactory">
<connectors>
<connector-ref connector-name="in-vm"/>
</connectors>
<entries>
<entry name="java:/ConnectionFactory"/>
<entry name="java:/XAConnectionFactory"/>
<entry name="jms/ConnectionFactory"/>
</entries>
</connection-factory>
嘿嘿, 重開server以後, 測試一下. 哇 恭喜老爺高中狀元, 留下十年寒窗的眼淚, 在console 下看到 我要看到的 Info 了.
@MessageDriven(mappedName = "jms/TestQueue", activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
變裝後
@MessageDriven( activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "/jms/TestQueue"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
差距就在他不吃 mappedName 的設定, 要改寫在 ActivationConfigProperty 裡頭. 不過我想如果改寫在 deploy jboss.xml 裡頭會比較好一點.
後記
搞了一個多禮拜(不包涵六日), 終於最基本的 EJB 都可以在 Jboss上面運做了. 心裡真的爽度很高, 但是也是這樣覺得 Jboss 的設定真的很複雜, 跟weblogic and glassfish 比較起來真的差距很大, 而且現階段 jboss.org 上面的 document 也都是停留在 jboss 5的文件. 所以很多文件讀起來跟實際 jboss 6 有點落差, 光是 JMS部份就 從 messaging 轉換到 hornetq. 所以, 文件中都使以 jboss messaging 為主體, 沒辦法直接套用在 jboss 6.
另外, 在讀 hornetq 的說明也都是如何將 hornetq 掛到 jboss5 上面的說明. 只能從example 跟 hornetq user guide 來推測放在 jboss6 上面應該要如何作設定.
這篇文章就是自己 在做完一整個search and retry 的心得跟作法.
沒有留言:
張貼留言