使用Spring3 + JNDI连接到EMS JMS队列

3

我在创建连接到Tibco 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.lookup(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(JndiObjectLocator.java:105)时 在org.springframework.jndi.JndiObjectFactoryBean.lookupWithFallback(JndiObjectFactoryBean.java:201)时 在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 more 我只收到了JMS队列本身的用户/密码 - 我在哪里设置它?
谢谢 Chris
3个回答

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" />

2

我曾经遇到过类似的问题,解决方法是在这个问题的解决方案之外添加如下内容:

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

jndiTemplate豆配置添加到:

1

我没有EMS的任何经验,但是用户和密码通常在连接工厂上设置,因此您需要在由JNDI提供的对象上进行配置。


如何在返回JMS连接工厂的JndiObjectFactoryBean上设置用户名/密码?我无法在上面的“jmsConnectionFactory” bean中设置它... - ChrisM
@Chris:你不是在那里设置它。 JndiObjectFactoryBean仅从JNDI注册表中检索对象。作为创建连接的责任方,连接工厂是您必须设置凭据的地方。 您需要前往在JNDI中配置连接工厂的任何位置,并在那里进行修复。 - Ryan Stewart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接