2011-07-20 61 views
3

我有一些問題創建到Tibco EMS JMS隊列的連接(並從中讀取)。使用Spring3 + JNDI連接到EMS JMS隊列

<beans> 
    <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"> 
     <property name="environment"> 
      <props> 
       <prop key="java.naming.factory.initial">com.tibco.tibjms.naming.TibjmsInitialContextFactory</prop> 
       <prop key="java.naming.provider.url">tcp://ems-dit-am-uat-1.app.xxx.net:30055</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiTemplate" ref="jndiTemplate" /> <property name="jndiName" 
     value="DRDRFIQueueConnectionFactory" /> </bean> 

    <bean id="jmsDestinationResolver" 
     class="org.springframework.jms.support.destination.JndiDestinationResolver"> 
     <property name="jndiTemplate" ref="jndiTemplate" /> 
     <property name="cache" value="true" /> 
    </bean> 

    <bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiTemplate" ref="jndiTemplate" /> 
     <property name="jndiName" value="Q.NY.DERIV.DRD.RFI" /> 
    </bean> 

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
     <property name="connectionFactory" ref="jmsConnectionFactory" /> 
     <property name="destinationResolver" ref="jmsDestinationResolver" /> 
     <property name="defaultDestination" ref="destination" /> 
    </bean> 


    <bean id="jmsReceiver" class="com.csfb.fao.rds.rfi.application.DRDReceiverTst"> 
     <property name="jmsTemplate"> 
      <ref bean="jmsTemplate" /> 
     </property> 
    </bean> 

</beans> 

我得到的例外是:

javax.naming.AuthenticationException:不允許:無效的名稱或 密碼[根異常javax.jms.JMSSecurityException:無效 名或密碼]在 com.tibco.tibjms.naming.TibjmsContext.lookup(TibjmsContext.java:668) 在 com.tibco.tibjms.naming.TibjmsContext.lookup(TibjmsContext.java:489) 在javax.naming.InitialContext中。查找(InitialContext.java:392) org.springframework.jndi.JndiTemplate $ 1.doInContext(JndiTemplate.java:154) 在 org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87) 在 org.springframework.jndi.JndiTemplate.lookup( JndiTemplate.java:152) 在 org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:178) 在 org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95) 在 org.springframework .jndi.JndiObjectLocator.lookup(JndiObjectLactor.java:105) at org.springframework.jndi.JndiObjectFactoryBean.lookupWithFallback(JndiObjectFactoryBean.java:201) at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:187) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) 在 org.springframework.beans.factory .support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) ...... 12多個

唯一的用戶名/密碼,我一直在考慮是JMS隊列本身 - 我在哪裏設置?

感謝 克里斯

回答

2

得到它 - 包裝連接工廠在UserCredentialsConnectionFactory需要:

<bean id="authenticationConnectionFactory" 
    class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter"> 
    <property name="targetConnectionFactory" ref="jmsConnectionFactory" /> 
    <property name="username" value="yyyyy" /> 
    <property name="password" value="xxxx" /> 
</bean> 

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" ref="authenticationConnectionFactory" /> 
    <property name="destinationResolver" ref="jmsDestinationResolver" /> 
    <property name="defaultDestination" ref="destination" /> 
1

我沒有與任何EMS經驗,但用戶名和密碼的連接工廠通常設置,所以你要配置的對象通過JNDI提供。

+0

如何在返回JMS連接工廠的JndiObjectFactoryBean上設置user/pwd?我無法在上面的'jmsConnectionFactory'bean中設置它.... – ChrisM

+0

@Chris:你不會在那裏設置它。 JndiObjectFactoryBean只從JNDI註冊表中檢索一個對象。連接工廠是負責創建連接的工具,您必須設置憑據。您需要到JNDI中配置連接工廠的地方並在那裏修復它。 –

2

我有一些類似的問題,解決方法是(從這個問題,除了解決方案)加上

<prop key="java.naming.security.principal">username</prop> 
<prop key="java.naming.security.credentials">password</prop> 

jndiTemplate bean配置