2013-04-01 111 views
1

我找不到任何體面的,清晰的示例來學習使用Spring配置的JMS組件。所以我寫了這樣的事情:在Weblogic服務器上使用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名稱)。它正在獲得連接,但會話卻給出了例外 有人能告訴我我的錯誤是什麼?

Thanx

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

回答

1

有一種變通方法解決,但。我仍然不知道什麼問題確實是,但不是weblogic的自身打造自己的目標,我把責任去春來,如:

<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> 

它現在的工作。

2

駱駝端點應引用「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> 
+0

感謝您的答案克勞斯。真的有價值的信息給我。但例外情況仍然如此。它仍然說:由於:javax.naming.NameNotFoundException:無法解析'weblogic.jms.backend.jms'。已解決'weblogic.jms.backend';剩餘名稱'jms' – Neron

+0

順便說一下,我不知道包名weblogic.jms.backend.jms來自哪裏。我認爲問題可能是關於weblogic jar本身。 – Neron

+0

是的JNDI查找可能會讓人痛苦。在名爲「jms/cdrPreMO-queue-jndi」的weblogic服務器上是否有隊列名稱?看起來stacktrace是關於查找/創建JMS目的地的。 –

0

雖然問題相當古老,但如果發現此錯誤,則爲其他用戶發佈此解決方案。我試圖在weblogic 12c版本中查找weblogic隊列時遇到了Camel 2.19版本的這個問題。在Weblogic中解析隊列目標時,這裏發生的查找很可能不是典型的JNDI查找。 終點URI應包含隊列詳情如下:

jms_server_name/jms_module_name!queue_name 

例如,如果隊列名稱是TestRequestQueue,模塊命名sample_jms_module和JMS服務器下創建名爲sample_jms_server在WebLogic中,那麼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 JMS服務器的名稱可以從WebLogic控制檯導航到以下路徑獲得: 服務 - >信息 - > JMS服務器

隊列的名稱,而不是JNDI名稱,可以得到從Weblogic控制檯導航到隊列並單擊「監視」選項卡。此選項卡顯示名稱列中隊列的目標名稱。

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();