簡體   English   中英

遠程JMS連接仍使用localhost

[英]Remote JMS connection still using localhost

我在遠程glassfish服務器上創建了一個JMS連接工廠,並希望從我本地計算機上的Java客戶端應用程序中使用該服務器。 我有以下配置來獲取上下文和連接工廠:

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,它只能在遠程服務器上使用。

我無法看到我在這里做錯了什么以及它為什么要嘗試使用localhost。

有任何想法嗎?

干杯,

詹姆士

我在嘗試為EJB進行遠程JNDI查找時遇到了類似的問題。 問題是在我的/ etc / hosts文件中,機器名被映射到本地主機,例如:

127.0.0.1 glassfish localhost.localdomain localhost

要查找資源,需要建立兩個連接。 第一個是找到您應該查找的服務器的位置。 第二個使用此IP進行查找。 在您的情況下,第一個連接是返回localhost(127.0.0.1)。 您的應用程序嘗試連接到localhost進行查找,但不能,因為沒有本地運行的glassfish。 要解決此問題,請確保您的主機文件類似於:

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

你可以在這里找到更多。

您必須區分獲取ConnectionFactory對象及其打開的連接。 獲取ConnectionFactory對象由JNDI處理(在本例中由CORBA支持)。 獲得ConnectionFactory對象后,它將使用其imqAddressList參數打開與JMS代理的連接。 默認情況下,它配置為localhost:7676,如果要打開與遠程代理的連接,則必須配置正確的值。

您必須檢查如何為綁定到jms / MyConnectionFactory的TopicConnectionFactory配置此參數。 有關如何在Glassfish中配置連接工廠的更多詳細信息,請參閱管理JMS連接工廠和目標

我有一個類似的問題,從另一台機器獲取JMS資源,然后運行GlassFish的機器(在我的情況下為v3.0.1)。

為了讓它工作,我做了以下事情:

  • 確保將JMS主機設置為服務器計算機的主機名(默認為localhost)。 [配置 - > Java消息服務 - > JMS主機]
  • 正如Matej建議的那樣,確保imqAddressList屬性使用相同的主機名。 [Resources-> Connectors-> Connector Connection Pool-> yourJmsConnectionFactory]
  • 而不是在Properties對象中配置屬性並將該對象提供給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的任何(內部)組件將自動使用正確的設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM