2011-05-30 137 views
2

我在本地安裝了openMQ,它工作正常。我使用下面的代碼來使用JNDI查找來獲取QueueConnectionFactory遠程訪問OpenMQ

Hashtable env = new Hashtable(); 
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory"); 
env.put(Context.PROVIDER_URL, "file:///C:/objectstore"); 
Context ctx = new InitialContext(env); 
QueueConnectionFactory myFactory = (QueueConnectionFactory) ctx.lookup("MyQueueConnection"); 

以上的回報我從那裏我還訪問replyQueuerequestQueue連接工廠。

這是我設置的隊列

imqobjmgr add -l "MyQueueConnection"" -j "java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContext 
Factory" -j "java.naming.provider.url=file:///C://objectstore" -t qf -o "imqAddressList=mq://localhost:7676/jms" 

imqobjmgr add -l "cn=DEVL.REQUEST" -j "java.naming.factory.initial=com.sun.jndi.fscontext.RefFSCon 
textFactory" -j "java.naming.provider.url=file:///C://objectstore" -t q -o "imqDestinationName=requestQueue" 

imqobjmgr add -l "cn=DEVL.REPLY" -j "java.naming.factory.initial=com.sun.jndi.fscontext.RefFSConte 
xtFactory" -j "java.naming.provider.url=file:///C://objectstore" -t q -o "imqDestinationName=replyQueue" 

我的問題是如何:

  1. 如何設置openMQ一個Linux 服務器上,這樣我可以從其他服務器訪問openMQ 其中 代碼將運行在tomcat apache服務器(也是一個linux盒子)中。

  2. 我會有什麼樣的變化做出 代碼即可獲得從openMQ
    坐在不同的服務器上
    QueueConnectionFactory

我沒有在GlassFish中運行openMQ,我自己運行openMQ(imqbrokerd.exe)。

回答

2

在我所有的挖掘中,我沒有發現任何可以表明OpenMQ在獨立使用時提供JNDI提供程序的任何內容。它看起來像由GlassFish提供的。這意味着你需要使用LDAP這樣的對象存儲,我還沒有做過。

目前,我通過複製.binding文件(在你的案例中的c:\ objectstore中的文件)轉移到JMeter可以看到的文件系統上「欺騙」,以便我可以引用它。只要你使用實際的機器名稱或IP,而不是本地主機,它可以工作,但顯然不會削減生產。

在Java方面,您可以完全刪除JNDI並直接實例化com.sun.messaging.ConnectionFactory。我用Spring來注入連接工廠。請注意,我必須包含我自己的一個非常簡單的OpenMQConnectionFactoryFactory(從https://wikis.oracle.com/display/GlassFish/OpenMQSpringConnectionConsumer中被盜),因爲com.sun.messaging.ConnectionFactory不是一個bean。

<bean id="connectionfactoryfactory" 
class="myownlibrary.messaging.factory.OpenMQConnectionFactoryFactory"> 
    <property name="properties"> 
     <props> 
      <prop key="imqAddressList">qa29-vm:7676</prop> 
      <prop key="imqAddressList">qa30-vm:7676</prop> 
      <prop key="imqReconnectAttempts">-1</prop>   
     </props> 
    </property> 
</bean> 

<bean id="connectionfactory" 
factory-bean="connectionfactoryfactory" 
factory-method="constructConnectionFactory"/> 

<bean id="jmsFactory" class="org.springframework.jms.connection.SingleConnectionFactory"> 
    <property name="targetConnectionFactory" ref="connectionfactory" /> 
</bean> 

當你`com.sun.messaging.ConnectionFactory`直接連接你如何指定URL
+0

? – Thufir 2015-03-10 11:16:53

+1

令人驚訝的是,儘管事實上我們沒有使用OpenMQ,但我仍然有我的.binding文件。嘗試這樣的: 'mq \:// qa29-vm \:7676/jms,mq \:// qa30-vm \:7676/jms' 引用了兩臺我已經設置爲羣集的機器。 – 2015-03-16 16:11:29