2010-03-26 45 views
2

我在遠程glassfish服務器上創建了JMS連接工廠,並且想從本地機器上的java客戶端應用程序使用該服務器。我有以下的配置,以獲取上下文和連接工廠:仍然使用本地主機的遠程JMS連接

Properties env = new Properties(); 
env.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory"); 
env.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming"); 
env.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"); 
env.setProperty("org.omg.CORBA.ORBInitialHost", JMS_SERVER_NAME); 
env.setProperty("org.omg.CORBA.ORBInitialPort", "3700"); 

initialContext = new InitialContext(env); 
TopicConnectionFactory topicConnectionFactory = (TopicConnectionFactory) initialContext.lookup("jms/MyConnectionFactory"); 
topicConnection = topicConnectionFactory.createTopicConnection(); 

topicConnection.start(); 

這似乎是工作,當我從GlassFish服務器中刪除的ConnectionFactory我得到一個異常,表明是無法找到JMS/MyConnectionFactory如預期。

但是,當我隨後使用我的topicConnection獲取主題時,它嘗試連接到localhost:7676(由於本地沒有運行glassfish,因此失敗)。

如果我動態創建一個話題:

TopicSession pubSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); 
Topic topic = pubSession.createTopic(topicName); 
TopicPublisher publisher = pubSession.createPublisher(topic); 
Message mapMessage = pubSession.createTextMessage(message); 
publisher.publish(mapMessage); 

和GlassFish服務器不在本地運行,我得到不過同樣的連接被拒絕,如果我開始我的本地GlassFish服務器的主題本地創建的,我可以看到他們在glassfish管理控制檯中。

如果你問我在我的本地glassfish實例上沒有jms/MyConnectionFactory,它只能在遠程服務器上使用。

我看不到我在這裏做錯了什麼,爲什麼它試圖使用本地主機。

任何想法?

乾杯,

詹姆斯

回答

2

你獲得的ConnectionFactory對象和它打開的連接進行區分。獲取ConnectionFactory對象由JNDI處理(在這種情況下由CORBA支持)。一旦獲得ConnectionFactory對象,它將使用其imqAddressList參數打開與JMS代理的連接。默認情況下,它被配置爲localhost:7676,如果要打開到遠程代理的連接,則必須配置適當的值。

您必須檢查爲該TopicConnectionFactory綁定到jms/MyConnectionFactory的此參數如何配置。有關如何在Glassfish中配置連接工廠的更多詳細信息,請參見Administering JMS Connection Factories and Destinations

+0

感謝您的幫助。我在我的ConnectionPoolFactory上添加了AddressList,現在我收到以下錯誤:org.omg.CORBA.COMM_FAILURE:vmcid:SUN次要代碼:201已完成:否有任何想法? – James 2010-03-26 11:28:18

+0

更多信息,我現在可以在遠程glassfish服務器的管理頁面上看到動態主題,但前提是我正在運行glassfish的本地實例。如果沒有本地版本的運行,我會從我以前的評論中得到異常。 – James 2010-03-26 11:51:22

+0

我一直在用3.1.2.2 Glassfish服務器來解決這個問題,我準備好尖叫了。我使用gf-client.jar和appclient.jar構建了一個遠程客戶端,這是我在http://docs.oracle.com/cd/E26576_01/doc.312/e24930/java-clients.htm#上的Oracle建議之後構建的。 gkuqa。我遵循了阿諾德的建議和您的建議。它似乎連接到正確的主機/端口,但我得到一個奇怪的NumberFormatException:警告:[C4003]:連接創建[10.20.10.207:3700]時發生錯誤。 - 原因:java.lang.NumberFormatException:用於輸入字符串:。任何想法爲什麼? – kpenrose 2013-04-12 19:53:08

4

我在嘗試爲EJB執行遠程JNDI查找時遇到了類似的問題。問題是,在我的/ etc/hosts文件的機器名被映射到本地主機一樣的東西:

127.0.0.1 glassfish localhost.localdomain localhost 

要查找資源,兩個連接製成。首先是找到你應該尋找的服務器的位置。第二個使用此IP來執行查找。在你的情況下,第一個連接返回本地主機(127.0.0.1)。您的應用程序嘗試連接到本地主機執行查找,因爲沒有在本地運行glassfish,所以無法執行查找。要解決此問題,請確保您的主機文件類似於:

127.0.0.1 localhost 
192.168.1.10 glassfish //(or what ever your server name is). 

您可以瞭解更多here

2

我有一個類似的問題,從另一臺機器獲得JMS資源,然後運行GlassFish(我的情況是v3.0.1)的機器。

爲了得到它的工作我做了以下內容:

  • 確保了JMS主機設置爲服務器計算機的主機名(默認爲localhost)。 [配置 - > Java消息服務 - > JMS主機]
  • 正如Matej建議的,確保imqAddressList屬性使用相同的主機名。 [資源 - >連接器 - >連接器連接池 - > yourJmsConnectionFactory] ​​
  • 不是然後配置屬性對象中的屬性並將該對象提供給InitialContext,我將它們設置爲JVM的屬性。這種特性可以提供啓動您的應用程序(java -Dorg.omg.CORBA.ORBInitialHost=myServerHost ...)時,或通過代碼(System.setProperty("org.omg.CORBA.ORBInitialHost","myServerHost");

需要對我來說,最後的措施,因爲在加載JMS資源,一些內部類(com.sun.enterprise .naming.factory.AdministeredObjectFactory以及其他人)創建了一個新的InitialContext,而不需要考慮我提供的屬性。新創建的InitialContext仍然指的是localhost,而不是myServerHost。

將屬性設置爲JVM屬性可以工作,因爲默認情況下InitialContext考慮了相關的JVM屬性集。任何創建新的InitialContext的(內部)組件都將自動使用正確的設置。

相關問題