0

我有一个简单的 Java Spring 应用程序,它使用 JNDI 查找 JMS 对象并将消息发布到 JMS 主题。在 WebLogic 10.3.6 上配置的 JNDI 和 JMS。只要 WebLogic 服务器启动并运行,所有这些都可以正常工作。

即使 WebLogic 服务器关闭,我也需要启动应用程序。我已将“lookupOnStartup”配置为“false”的 JNDI 对象。

下面是我的 Spring 配置。

    <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
        <props>
            <prop key="java.naming.factory.initial">${jndi.initialFactory}</prop>
            <prop key="java.naming.provider.url">${jndi.providerurl}</prop>
        </props>
    </property>
</bean>

<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate">
        <ref bean="jndiTemplate" />
    </property>
    <property name="jndiName">
        <value>${jms.connectionFactory}</value>
    </property>
    <property name="lookupOnStartup" value="false" />
    <property name="proxyInterface" value="javax.jms.ConnectionFactory" />
</bean>

<bean id="myTopic" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate">
        <ref bean="jndiTemplate" />
    </property>
    <property name="jndiName">
        <value>${jms.mytopic}</value>
    </property>
    <property name="lookupOnStartup" value="false" />
    <property name="proxyInterface" value="javax.jms.Destination" />
</bean>

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

<bean id="myTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="defaultDestination" ref="myTopic" />
    <property name="destinationResolver" ref="jmsDestinationResolver" />
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="sessionAcknowledgeModeName" value="AUTO_ACKNOWLEDGE" />
    <property name="sessionTransacted" value="false" />
</bean>

在运行时,我得到以下异常:

Exception in thread "main" org.springframework.jms.InvalidDestinationException: [JMSClientExceptions:055142]Foreign destination, jmsserver-module!my-topic; nested exception is weblogic.jms.common.InvalidDestinationException: [JMSClientExceptions:055142]Foreign destination, jmsserver-module!my-topic
at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:285)
at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:169)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:497)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:569)
...
Caused by: weblogic.jms.common.InvalidDestinationException: [JMSClientExceptions:055142]Foreign destination, jmsserver-module!my-topic
at weblogic.jms.common.Destination.checkDestinationType(Destination.java:105)
at weblogic.jms.client.JMSSession.setupJMSProducer(JMSSession.java:2830)
at weblogic.jms.client.JMSSession.createProducer(JMSSession.java:2858)
at weblogic.jms.client.JMSSession.createProducer(JMSSession.java:2822)
at weblogic.jms.client.WLSessionImpl.createProducer(WLSessionImpl.java:827)
at org.springframework.jms.core.JmsTemplate.doCreateProducer(JmsTemplate.java:1143)
at org.springframework.jms.core.JmsTemplate.createProducer(JmsTemplate.java:1124)
at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:601)
at org.springframework.jms.core.JmsTemplate$3.doInJms(JmsTemplate.java:572)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:494)
... 3 more

任何帮助深表感谢。谢谢!

4

1 回答 1

1

在 Destination.java 中:

if(!(destination instanceof DestinationImpl))
            throw new InvalidDestinationException

代理的 connectionFactory 无法解析目标类型。我能够通过仅向 JmsTemplate 提供目标名称并使用 JNDI destinationResolver 按需解析目标类型来解决此问题。所以修改后的 Spring 配置如下:

<bean id="myTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="defaultDestinationName"> 
    <value>${jms.mytopic}</value> 
</property> 
<property name="destinationResolver" ref="jmsDestinationResolver" />
<property name="connectionFactory" ref="connectionFactory" />
<property name="sessionAcknowledgeModeName" value="AUTO_ACKNOWLEDGE" />
<property name="sessionTransacted" value="false" />

于 2015-08-26T17:18:09.237 回答