2014-02-11 73 views
3

我有兩個JBoss服務器,JbossA和JbossB。每個都有自己的JNDI。現在我在JbossA上有一個名爲jms/Client的JMS和一個名爲jms/Server的JbossB上的JMS。配置JBoss JNDI綁定到不同服務器上的JNDI?

現在我想讓JbossA上的應用程序能夠使用自己的JNDI訪問jms/Server。另外,我希望JbossB上的應用程序使用jndi-name jms/Client1使用它自己的JNDI來訪問jms/Client。

在短:

JbossA/ 
     JNDI/ 
      jms/Client 
      jms/Server -> JbossB/JNDI/jms/Server 


JbossB/ 
     JNDI/ 
      jms/Server 
      jms/Client1 -> JBossA/JNDI/jms/Client 
    APPA上JbossA訪問使用JbossA/JNDI JMS /客戶端和JMS /服務器
  • APPB上JbossB訪問JMS /服務器和JMS /客戶端1使用JbossB/JNDI

兩個問題:

  1. 有可能嗎?
  2. 如果是這樣,我將如何在JBoss EAP 6.0.1(Jboss 7.1)中進行配置?
+1

這純粹是一個應用程序/ jndi問題。我正在刪除hornetq標籤 –

+0

你說得對。道歉... – dstibbe

回答

0

首先,我想不出一個很好的理由,你爲什麼要查找一個MDB,那些應該只由容器調用(通過JMS實現是精確的),但是如果你正在試圖查找JMS發佈者或連接,那麼你所要求的完全有意義。因此,JBoss 7引入了一個很好的新功能,Remote Naming Project完全符合你的需求,問題是,顯然,它只能綁定遠程EJB,你可以嘗試一下。我個人認爲,JBoss團隊(我非常感謝這樣一個偉大的工作)在這方面有點落後(也許他們有一個很好的理由?),其他JEE容器能夠做到這在Weblogic中有一段時間叫做Foreign JNDI Binding,但無論如何,如果上述不起作用,並且您絕對需要這樣做,恐怕唯一剩下的解決方案就是以編程的方式執行它,在這種情況下,請繼續閱讀以下內容。

javax.naming API提供一種方式來綁定引用對象本地命名上下文外,只需使用InitialContext.bind(String name, Object obj),但不是結合實際對象綁定的javax.naming.Reference一個實例。從javadocs中可以看到,要創建Reference實例,需要提供一個實現javax.naming.RefAddr的實例,其中包含必要的信息以定位遠程對象,並且實現了一個javax.naming.spi.ObjectFactory,這是實現該實現的對象查找以獲取您的遠程對象。它會是這個樣子:

InitialContext ctx = new InitialContext(); 
ForeignJNDIObjectRefAddr refAddr = getRemoteObjectJNDIInfo(...; 
ctx.bind("jms/Server", new Reference("java.lang.Object", 
       refAddr, ForeignJNDIObjectFactory.class.getName(), null)); 

在這種情況下,你已經實現ForeignJNDIObjectRefAddrForeignJNDIObjectFactory,當它的時間做一下,你的ForeignJNDIObjectFactory.getObjectInstance方法會與ForeignJNDIObjectRefAddr實例作爲其第一個參數調用,以便您擁有完成查找所需的所有信息並返回遠程對象。祝你好運!

+0

我沒有提到有關MDB的任何內容?我想查找一個JMS連接。我意識到EJB的遠程命名項目,但不幸的是,這對我的JMSs沒有用處。另外,我不希望用java綁定遠程JMS,因爲我希望它(對於應用程序)在JMS來自何處時是完全透明的。應用程序聯繫一個單一的JNDI,它提供了他所要求的...無論如何,這是主意。 – dstibbe

+0

yeahp,你想查找一個連接,這就是我的想法。另一方面,就像我說的,如果你不想支付許可證,因爲我知道它看起來你沒有很多其他的選擇。關於編程方法,這也正是使您的企業並不一定知道那裏的JMS從何而來,它可以全部集中,從配置加載,將只需要做一次的方式,你實現它的方式是完全取決於你,我只描述了基本機制。 – Camilo

0

這是可能的。如果你可以升級你的EAP版本,那更容易。如果您有EAP訂閱,我沒有看到保留舊版本的理由。自從有很多bug被修復。

EAP 6.2.0 release notes

外部JNDI聯邦

命名子系統配置已被添加到JBoss EAP 6配置 ,它使管理員到外部 命名系統連接到JBoss EAP 6 JNDI。此功能取代了的JBoss EAP 5

然而 ExternalContextMBean,即使有EAP對6.0.x可以使用

<subsystem xmlns="urn:jboss:domain:naming:1.2"> 
    <bindings> 
     <object-factory name="java:global/myExtContext" module="my.custom.module" class="my.example.class.ExternalContextObjectFactory"/> 
    </bindings> 
    <remote-naming/> 
</subsystem> 

而且在my.custom.module模塊實現ExternalContextObjectFactory像

public class ExternalContextObjectFactory implements ObjectFactory { 
    @Override 
    public Object getObjectInstance(final Object obj, final Name name, final Context nameCtx, final Hashtable<?, ?> environment) throws Exception { 
     Hashtable env = new Hashtable(); 
     if(environment != null) 
     env.putAll(environment); 
     env.set(/* all the properties you will need for your target context */); 
     return new InitialContext(environment); 
    } 
} 

所以,你的目標上下文將被綁定到java:global/myExtContext

0

此使用外部JNDI聯邦是可行的包括在EAP 6.x中您需要定義全局綁定屬性。休息是爲你探討:)

shishir