远程访问jboss
JBoss(序)?
?
2009-11-26 10:54:27|? 分類: JBoss
?
Oracle Communications Presence,簡稱OCP,公司用的服務器之一。里面有許多MBean,而我的任務就是調用其中的一個MBean創建一個新用戶,就在解決這個任務的過程中,由于"JMX"跟"EJB"都沒有學過,遇到了很多麻煩,而在這麻煩之中,最麻煩的要數XML配置文件,讓人眼花繚亂,諸如:application.xml,orion-application.xml,jboss-app.xml,jboss-service.xml等等,心底便開始討厭Oracle的并購做法,其自身服務器有OC4J,并購了BEA之后,又有了WebLogic,再加上幾個JBoss的配置文件,哎,一塌糊涂,這OCP服務器,到底是啥來的?看來SUN的產品還真是岌岌可危啊~~。
??????看來要解決手頭上的任務,還真是不簡單,雖然老大一直催著任務,但是也沒有辦法,只好匆匆的學起"JMX"與"EJB",也就順理成章的了解起了JBoss,而為什么不是Weblogic呢,因為它已經被并購了,沒前途了,哈哈,而OC4J嘛,不開源。相反,JBoss則是受到開源社區的熱捧。
1. 遠程訪問EJB
???????針對EJB(1)中的HelloEJB例子中,如果在局域網內的另一臺機器調用部署在JBoss里面的HelloEJB,則需將HelloEJBClient中的prop.put("java.naming.provider.url","localhost:1099");這段代碼改為prop.put("java.naming.provider.url","192.168.2.182:1099");,也就是將localhost改為JBoss所在的IP地址,運行,如無意外,將會出錯,錯誤信息大概為:Could not obtain connection to any of these urls: 192.168.2.182:1099。
2. 訪問http://192.168.2.182:8080或者http://127.0.0.1:8080
??????此時第一反應便是ping 192.168.2.182,結果并沒有出現任何問題,接著便訪問http://192.168.2.182:8080,發現不能訪問,如果是服務器是Tomcat的話,該訪問是沒有任何問題的。于是便上網搜索,發現JBoss是默認將IP綁定為127.0.0.1的,所以便會出現訪問不了http://192.168.2.182:8080,甚至在JBoss服務器本機也不能訪問該地址。而只能訪問http://127.0.0.1:8080或者http://localhost:8080,那該如何解決呢?
???????打開%JBOSS_HOME%\server\default\deploy\jbossweb.sar目錄,編輯server.xml,找到
<Connector protocol="HTTP/1.1"port="8080" address="${jboss.bind.address}"??????????????????????????????????????????????????????????????connectionTimeout="20000" redirectPort="8443" />
<Connector protocol="AJP/1.3"port="8009" ddress="${jboss.bind.address}"
????????????????? redirectPort="8443"/>
將address="${jboss.bind.address}修改為address="192.168.2.182",重啟JBoss,便可以在局域網中的任何一臺機器上訪問http://192.168.2.182:8080,可這次如果在JBoss服務器本機上卻不能訪問http://127.0.0.1:8080,如果要讓兩個同時都能訪問,則需將address="192.168.2.182"修改為address="0.0.0.0"。
3.解決遠程訪問EJB
??????現在再次調用HelloEJBClient,發現錯誤依然,可見上面的修改并沒有影響到EJB的調用,仔細想想,剛才所修改的是web的URL,而EJB所需要的是JNDI的URL,所以錯誤依然,再通過網絡搜索,發現可以通過以下方法解決,在%JBOSS_HOME%\bin目錄下,創建run.bat的快捷方式,然后如圖所示在其Target后面加上--host=192.168.2.182,重啟JBoss,然后再次調用HelloEJBClient即可成功。
如果是在eclipse開發環境下的話,打開Servers視圖,雙擊Jboss服務器,再點擊Overview視圖中的Open launch configuration,在彈出來的對話框里,如圖所示輸入--host=192.168.2.182,確定之后重啟Jboss,即可。
至于如何設置JBoss的配置文件才能達到這一效果,目前還沒有找到,找到了再添加。
?
1. JNDI命名
針對EJB(1)中的Hello類,代碼如下:
Hello:
package org.lmxzz.example.ejb.sever;
?
import javax.ejb.Stateless;
?
/**
?*Session Bean implementation class Hello
?*/
@Stateless(mappedName ="HelloEJB/Hello")
public class Hello implements HelloRemote {
?
???/**
????* Default constructor.
????*/
???public Hello() {
???????// TODO Auto-generated constructor stub
??? }
}
日志里描述了mappedName="HelloEJB/Hello"指明了該Session EJB的JNDI URL(JNDI名稱),其實,如果在沒有注明mappedName屬性的時候,EJB會默認使用以下JNDI命名規則:
(1)如果EJB應用打包成后綴為*.ear的發布文件,默認的JNDI名稱是
本地接口:包名/類名/local,遠程接口:包名/類名/remote
例如,HelloEJB打包為HelloEJB.ear文件,則其本地接口為HelloEJB/Hello/local,遠程接口為 HelloEJB/Hello/Remote。
(2)如果EJB應用打包成后綴為*.jar的發布文件,默認的JNDI名稱是
本地接口:類名/local,遠程接口:類名/remote
例如,HelloEJB打包為HelloEJB.jar文件,則其本地接口為Hello/local,遠程接口為:Hello/remote。
2. Annotations
指定本地接口跟遠程接口兩種方式:
(1)在實現類Hello里加上@Lacal和@Remote注釋,并分別指定本地接口和遠程接口的具體的類
@Stateless
@Local({HelloLocal.class})
@Remote({HelloRemote.class})
public class Hello implements HelloLocal,HelloRemote {
????. . .
}
public interface HelloLocal {
}
public interface HelloRemote {
}
(2)在本地接口和遠程接口分別加上@Lacal和@Remote注釋,感覺此種方式比較簡潔明了。
@Stateless
public class Hello implements HelloLocal,HelloRemote {
????. . .
}
@Local
public interface HelloLocal {
}
@Remote
public interface HelloRemote {
}
在上述的情況下,再指定本地接口跟遠程接口JNDI名稱的兩種方式:
(1)在實現類Hello里加上@LacalBinding和@RemoteBinding注釋,并指定具體的JNDI名稱
@LocalBinding(jndiBinding="HelloEJB/HelloLocal")
@RemoteBinding(jndiBinding="HelloEJB/HelloRemote")
public class Hello implements HelloLocal,HelloRemote {
????. . .
}
public interface HelloLocal {
}
public interface HelloRemote {
}
(2)在本地接口和遠程接口分別加上@LocalBinding和@RemoteBinding注釋,并指定具體的JNDI名稱
public class Hello implements HelloLocal,HelloRemote {
????. . .
}
@LocalBinding(jndiBinding="HelloEJB/HelloLocal")
public interface HelloLocal {
}
@RemoteBinding(jndiBinding="HelloEJB/HelloRemote")
public interface HelloRemote {
}
?
此時部署到JBoss上面,則會在Console出現如下信息:
HelloEJB/HelloRemote - EJB3.x DefaultRemote Business Interface
Hello/remote-org.lmxzz.example.ejb.sever.HelloRemote- EJB3.x Remote Business Interface
HelloEJB/HelloLocal - EJB3.x Default LocalBusiness Interface
Hello/local-org.lmxzz.example.ejb.sever.HelloLocal- EJB3.x Local Business Interface
?
3. 本地接口與遠程接口
本地接口是指在同個JVM調用,而遠程接口指的是在不同的JVM調用,如果在同一JVM調用EJB,采用Local接口訪問EJB會優于Remote接口,因為Remote接口訪問EJB需要經過遠程方法調用(RPCs)環節,而Local接口訪問EJB是直接從JVM中返回EJB的引用。(發布到EJB容器之后,則該EJB與EJB容器同個JVM)
?
4. Stateless與Stateful
無狀態Session Bean即不會單獨保存Bean的數據,也就是說,共享該Bean的數據,就像public static字段一樣,而有狀態Session Bean則會單獨保存Bean的數據,每次調用該Bean就猶如新建一新線程一樣。
總結
- 上一篇: EJBCA使用之注册用户及创建证书
- 下一篇: 介绍KeyTool GUI工具2款