簡體   English   中英

Weblogic Server上帶有Spring的Camel JMS組件

[英]Camel JMS Component with Spring on Weblogic Server

我找不到任何合適的,清晰的示例來學習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名稱)。 它正在獲得連接和會話,但是卻給出了例外情況有人可以告訴我我有什么錯誤嗎?

感謝名單

編輯:根據克勞斯的評論應用修復程序。

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>

解決,但有解決方法。 我仍然不知道真正的問題是什么,但是我沒有像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>

現在正在工作。

盡管問題已經很久了,但是如果其他用戶遇到此錯誤,請發布此解決方案。 我在嘗試在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服務器

可以通過從Weblogic控制台導航到隊列並單擊“監視”選項卡來獲取隊列的名稱,而不是JNDI名稱。 此選項卡在名稱列中顯示隊列的目標名稱。

我剛剛在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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM