【问题标题】:JMS error: can not send into foreign destinationsJMS 错误:无法发送到国外目的地
【发布时间】:2010-05-20 08:59:26
【问题描述】:

我使用 Spring 配置的 jms 模板和 tibco jms 库。 我使用 JNDI 获得 jms 连接工厂和主题,并且这些对象不为空。但是当我尝试发送消息或添加监听器时,我得到了这个异常:

对于听众:

Exception in thread "main" org.springframework.jms.InvalidDestinationException: Can not send into foreign destinations; nested exception is javax.jms.InvalidDestinationException: Can not send into foreign destinations
    at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:277)
    at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:168)
    at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:474)
    at org.springframework.jms.core.JmsTemplate.receiveSelected(JmsTemplate.java:700)
    at org.springframework.jms.core.JmsTemplate.receive(JmsTemplate.java:682)
    at org.springframework.jms.core.JmsTemplate.receive(JmsTemplate.java:674)

发件人:

Exception in thread "main" org.springframework.jms.InvalidDestinationException: Invalid or foreigndestination; nested exception is javax.jms.InvalidDestinationException: Invalid or foreigndestination
    at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:277)
    at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:168)
    at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:474)
    at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:539)
    at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:531)

客户端应用程序正在处理相同的主题而没有问题(因此 jms 服务器正在运行)。你有什么想法?我在 javadoc 中读到了这个异常,但找不到如何理解根本问题并修复它。 谢谢

更新: 配置中JMS相关部分:

<bean id="JmsFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
          <property name="jndiName" value="${jms.factory}"/>
          <property name="proxyInterface" value="javax.jms.TopicConnectionFactory" />
          <property name="lookupOnStartup" value="false" />
          <property name="jndiEnvironment">
            <props>
              <prop key="java.naming.provider.url">${jms.namingProvider}</prop>
              <prop key="java.naming.factory.initial">${jms.namingFactory}</prop>
              <prop key="java.naming.referral">${jms.namingReferral}</prop>
              <prop key="java.naming.security.credentials">${jms.securityCredentials}</prop>
              <prop key="java.naming.security.principal">${jms.securityPrincipal}</prop>
            </props>
          </property>
      </bean>

        <bean id="JmsTopic" class="org.springframework.jndi.JndiObjectFactoryBean">
          <property name="jndiName" value="${jms.topic}"/>
          <property name="proxyInterface" value="javax.jms.Topic" />
          <property name="lookupOnStartup" value="false" />
          <property name="jndiEnvironment">
            <props>
              <prop key="java.naming.provider.url">${jms.namingProvider}</prop>
              <prop key="java.naming.factory.initial">${jms.namingFactory}</prop>
              <prop key="java.naming.referral">${jms.namingReferral}</prop>
              <prop key="java.naming.security.credentials">${jms.securityCredentials}</prop>
              <prop key="java.naming.security.principal">${jms.securityPrincipal}</prop>
            </props>
          </property>
      </bean>

      <bean id="UserCredentialsConnectionFactory"
        class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
        <property name="targetConnectionFactory">
          <ref bean="JmsFactory" />
        </property>
        <property name="username" value="${jms.user}" />
        <property name="password" value="${jms.password}" />
      </bean>

      <bean id="JmsTemplate"
        class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory"
          ref="UserCredentialsConnectionFactory" />
        <property name="defaultDestination">
            <ref bean="JmsTopic"/>
        </property>
        <property name="pubSubDomain" value="true" />
      </bean>

【问题讨论】:

    标签: java jms tibco


    【解决方案1】:

    听起来您已将其配置为尝试创建目标而不是执行 jndi 查找以获取已在 EMS 实例上定义的目标。

    你需要发布你的 spring 配置来确定。

    编辑:如果您在 JmsTemplate 上设置了目的地名称并为它提供了 JndiDestinationResolver,那么它应该可以工作

    【讨论】:

    • Matt,我在第一条消息中添加了 spring 配置
    • 我大约 2 年前遇到了这个问题,所以我可能记错了,但是 IIRC 在这里发生的 tibco 是传递给 setDefaultDestination 的引用不能解决您认为的问题(对真实的引用通过 jndi 获得的目标),而是一些不是目标实例的 jndi 对象。在调试器下运行它并在 Spring 代码中的正确位置设置断点应该会很明显。
    • Matt,您关于 JndiDestinationResolver 的更新解决了我的问题,谢谢
    猜你喜欢
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    相关资源
    最近更新 更多