【问题标题】:Camel JMS Component with Spring on Weblogic ServerWeblogic Server 上带有 Spring 的 Camel JMS 组件
【发布时间】:2013-04-01 09:01:11
【问题描述】:

我找不到任何像样的、清晰的例子来学习带有 Spring 配置的 JMS 组件。所以我写了这样的东西:

<bean id="weblogic" class="org.apache.camel.component.jms.JmsComponent">
    <property name="connectionFactory" ref="jmsConnectionFactory"/>
</bean>

<bean id="jmsJndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
        <props>
            <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
            <prop key="java.naming.provider.url">t3://${ip}:${port}</prop>
        </props>
    </property>
</bean>
<bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate" ref="jmsJndiTemplate"/>
    <property name="jndiName" value="jms/cdrPreMO-connfact-jndi"/>
</bean>

<camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring">

    <camel:endpoint id="jmsQueue" uri="weblogic:queue:jms/cdrPreMO-queue-jndi"/>

    <route>
        <from ref="jmsQueue"/>
        <bean ref="test" method="writeFile"/>
        <to uri="log:errors?level=ERROR"/>
    </route>
</camelContext>

但它给出了例外:

Caused by: javax.naming.NameNotFoundException: Unable to resolve 'weblogic.jms.backend.jms'. Resolved 'weblogic.jms.backend'; remaining name 'jms'
    at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1139)
    at weblogic.jndi.internal.BasicNamingNode.lookupHere(BasicNamingNode.java:252)
    at weblogic.jndi.internal.ServerNamingNode.lookupHere(ServerNamingNode.java:182)
    at weblogic.jndi.internal.BasicNamingNode.lookup(BasicNamingNode.java:206)
    at weblogic.jndi.internal.BasicNamingNode.lookup(BasicNamingNode.java:214)
    at weblogic.jndi.internal.BasicNamingNode.lookup(BasicNamingNode.java:214)
    at weblogic.jndi.internal.BasicNamingNode.lookup(BasicNamingNode.java:214)
    at weblogic.jndi.internal.WLEventContextImpl.lookup(WLEventContextImpl.java:254)
    at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:393)
    at weblogic.jms.frontend.FEManager.destinationCreate(FEManager.java:287)
    ... 8 more

JMS Conf 为真(IP 端口和 jndi 名称)。它正在获取连接和会话,但给出了异常 谁能告诉我我的错误是什么?

感谢

编辑:根据克劳斯的评论应用修复。

【问题讨论】:

    标签: spring jms weblogic apache-camel


    【解决方案1】:

    Camel 端点应将“weblogic”作为组件名称。

    <camel:endpoint id="jmsQueue" uri="jms:queue:jms/cdrPreMO-queue-jndi"/>
    

    应该是

    <camel:endpoint id="jmsQueue" uri="weblogic:queue:jms/cdrPreMO-queue-jndi"/>
    

    因为这是您在 标记的 id 属性中为 JMS 组件指定的名称,例如

    <bean id="weblogic" class="org.apache.camel.component.jms.JmsComponent">
        <property name="connectionFactory" ref="jmsConnectionFactory"/>
    </bean>
    

    【讨论】:

    • 感谢克劳斯的回答。对我来说非常有价值的信息。但例外仍然相同。它仍然说:引起:javax.naming.NameNotFoundException:无法解析'weblogic.jms.backend.jms'。解决了'weblogic.jms.backend';剩下的名字'jms'
    • 顺便说一下我不知道包名weblogic.jms.backend.jms是从哪里来的。我认为问题可能与weblogic jar本身有关。
    • 是的,JNDI 查找工作起来会很痛苦。您在 weblogic 服务器上是否有名为“jms/cdrPreMO-queue-jndi”的队列名称。似乎堆栈跟踪是关于查找/创建 JMS 目的地。
    • 队列模块的JNDI名字是jms/cdrPreMO-queue-jndi并且存在。当我尝试创建自己的目标实例时,它 spring 没有给出任何异常。但我不知道“weblogic.jms.backend.jms”包是什么。例外没有给我任何东西
    • 克劳斯,你拯救了我的一天!!谢谢。
    【解决方案2】:

    已解决,但有解决方法。我仍然不知道问题到底是什么,但是,我没有让 weblogic 自己创建自己的目的地,而是将责任交给了 spring,例如:

    <bean id="weblogic" class="org.apache.camel.component.jms.JmsComponent">
        <property name="configuration" ref="jmsConfiguration" />
    </bean>
    
    <bean id="jmsJndiTemplate" class="org.springframework.jndi.JndiTemplate">
        <property name="environment">
            <props>
                <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
                <prop key="java.naming.provider.url">${ip}:${port}</prop>
            </props>
        </property>
    </bean>
    
    <bean id="jndiDestinationResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver">
            <property name="jndiTemplate" ref="jmsJndiTemplate"/>
    </bean>
    
    <bean id="jmsConfiguration" class="org.apache.camel.component.jms.JmsConfiguration">
            <property name="connectionFactory" ref="jmsConnectionFactory"/>
            <property name="destinationResolver" ref="jndiDestinationResolver"/>
        </bean>
    
    <bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate" ref="jmsJndiTemplate"/>
        <property name="jndiName" value="jms/cdrPreMO-connfact-jndi"/>
    </bean>
    

    它现在正在工作。

    【讨论】:

      【解决方案3】:

      虽然问题已经很老了,但如果其他用户遇到此错误,请将此解决方案发布给他们。我在尝试在 weblogic 12c 版本中查找 weblogic 队列时在 Camel 2.19 版本上遇到了这个问题。在 Weblogic 中解析队列目标时,此处发生的查找很可能不是典型的 JNDI 查找。 端点 uri 应包含队列详细信息,如下所示:

      jms_server_name/jms_module_name!queue_name
      

      例如,如果队列名称是 TestRequestQueue,在名为 sample_jms_module 的模块下创建,而 JMS 服务器在 Weblogic 中名为 sample_jms_server,则 uri 需要如下:

      <camel:endpoint id="jmsQueue" uri="weblogic:queue:sample_jms_server/sample_jms_module!TestRequestQueue"/>
      

      在 uri weblogic:queue: 的前缀部分,组件名称可以是任何内容,只要它引用创建的组件即可。它不一定是weblogic。例如,如果 JmsComponent 被命名为test-jms,则需要将 uri 声明为前缀为 test-jms:queue:

      可以通过导航到以下路径从 Weblogic 控制台获取 weblogic 中 JMS 服务器的名称: 服务 -> 消息传递 -> JMS 服务器

      队列的名称,而不是 JNDI 名称,可以通过导航到队列并单击“监控”选项卡从 Weblogic 控制台获取。此选项卡在名称列中显示队列的目标名称。

      【讨论】:

        【解决方案4】:

        我刚刚在 weblogic 12c 中使用下一个配置运行了 apache camel jms 组件。键是队列的 jndi 名称。 它必须是 ./module_name!queueName。 './' 表示本地 jms 服务器。

            <jee:jndi-lookup id="connectionFactoryBean" jndi-name="dpxcomConnectionFactory"/>
        
        
         <bean id="dpxcomJMSConnectionFactory"
                class="org.springframework.jms.connection.CachingConnectionFactory">
                <constructor-arg ref="connectionFactoryBean"/>   
                <property name="sessionCacheSize" value="50"/>
        
            </bean>
        
        
        Route definition:
            from("jms:queue:./DPXCOM!"+config.getMainQueueName()+"?concurrentConsumers="+config.getConcurrentConsumers()
                      +"&maxConcurrentConsumers="+config.getConcurrentConsumers()+"&jmsMessageType=Text&testConnectionOnStartup=true&connectionFactory=dpxcomJMSConnectionFactory&consumerType=Simple")
                .setHeader("jmsMessage").body()
                .process(new VerifyJMSMessageProcessor())
                .choice()
                ..
                ..
        end();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-15
          • 2013-01-06
          • 2014-04-17
          • 2023-03-05
          • 2014-09-16
          • 1970-01-01
          • 2013-05-22
          • 2015-07-01
          相关资源
          最近更新 更多