[英]Remote EJB lookup in Websphere (and Weblogic/JBoss)
我有一個用於搜索的EJB類,
@Local(ILuceneEmployeeSearchManagerLocal.class)
@Remote(ILuceneEmployeeSearchManagerRemote.class)
public class LuceneEmployeeSearchManager implements ILuceneEmployeeSearchManagerLocal, ILuceneEmployeeSearchManagerRemote{
....
}
同一個EAR中的WAR項目中還有另一個類,可以訪問它,
public class EmployeeAccessor {
private ILuceneEmployeeSearchManagerRemote searcher;
public EmployeeMstAccessor() {
Context ic = null;
try {
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "<WHAT_TO_PUT_HERE>");
props.put(Context.PROVIDER_URL, "iiop://127.0.0.1:9083");
ic = new InitialContext(props);
this.searcher = (ILuceneEmployeeSearchManagerRemote) ic
.lookup("<WHAT_TO_PUT_HERE?>");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
....
}
當我使用JNDI執行本地查找時,這非常有效。 由於某些要求,現在需要在多個AP中部署EAR(在群集和非群集環境中)。 此外,所使用的應用程序服務器在AP之間是相同的,但不一定是Websphere,即所有AP都可能使用JBoss / Websphere / Weblogic。
我的問題是有一種獨立於實現的查找和調用遠程EJB的方法嗎? 適用於Websphere,Weblogic或JBoss環境(同構環境)的東西。
我的第二個問題是假設AP服務器正在運行Websphere(在集群或非集群環境中),比如說我希望所有AP服務器中的EmployeeAccessor都使用部署在AP01中的LuceneEmployeeSearchManager EJB(ip:xxxx,port:yy),我該如何配置? 是否有必要提供完整的JNDI名稱(包括websphere的單元名稱和節點名稱)? INITIAL_CONTEXT_FACTORY的正確值是什么? 什么是正確的JNDI查找語法?
感謝您的任何幫助 :)
您應該使用默認的InitialContext()
構造函數 - 然后它與平台無關,並使用ejb引用 - 然后它與位置無關 - 您在安裝期間映射引用。 因此代碼是獨立的,但映射是特定於平台的,但是在應用程序之外完成。 如果您使用的是Java EE 6兼容服務器,則還可以使用注入@EJB.
所以你的代碼可能是這樣的:
public EmployeeMstAccessor() {
Context ic = null;
try {
ic = new InitialContext();
this.searcher = (ILuceneEmployeeSearchManagerRemote) ic
.lookup("java:comp/env/ejb/ILuceneEmployeeSearchManagerRemoteRef");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
然后,您需要在Web模塊的web.xml
中創建ejb/ILuceneEmployeeSearchManagerRemoteRef
EJB引用,並將該引用映射到bean的JNDI名稱。 它可以在應用程序的安裝/配置期間完成,或者在WebSphere的情況下通過ibm-web-bnd.xml
文件完成。
下面是帶有@EJB
示例(這必須是用於Java EE 5的servlet或JSF managedBean,對於Java EE 6,您可以將它放在任何類中,但是您需要為應用程序啟用CDI):
public class MyServlet exetends HttpServlet {
@EJB(name="ejb/ILuceneEmployeeSearchManagerRemote")
private ILuceneEmployeeSearchManagerRemote searcher; // replaces lookup
...}
再次,您需要將@EJB
注釋定義的ejb/ILuceneEmployeeSearchManagerRemote
引用映射到實際的JNDI名稱。
關於您的第二個問題(在WebSphere的情況下):
如果bean位於SAME單元格上,但在其他服務器上,它將采用以下形式:
cell/nodes/<node-name>/servers/<server-name>/<name binding location>
例如:
cell/nodes/S47NLA1/servers/Server47A1/ejb/Department549/AccountProcessors/CheckingAccountReconciler
如果bean在外部單元格中,那么最好的方法是,如果要避免在Initial上下文中提供屬性(主機,端口,工廠),則使用已配置的綁定。 請記住,對於默認配置中的跨單元格,您必須交換SSL證書才能使其正常工作。
也可以看看:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.