2

我找不到任何体面、清晰的示例来学习使用 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 名称)。它正在建立连接和会话,但给出了异常有人能告诉我我的错误是什么吗?

谢谢

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

4

4 回答 4

3

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

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

应该

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

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

<bean id="weblogic" class="org.apache.camel.component.jms.JmsComponent">
    <property name="connectionFactory" ref="jmsConnectionFactory"/>
</bean>
于 2013-04-02T11:35:51.967 回答
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>

它现在正在工作。

于 2013-04-03T08:49:51.690 回答
1

尽管问题已经很老了,但如果其他用户收到此错误,请将此解决方案发布给他们。我在尝试在 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 服务器的名称:Services -> Messaging -> JMS Servers

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

于 2017-07-07T16:01:33.757 回答
0

我刚刚在 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();
于 2017-08-14T06:43:55.077 回答