2013-05-27 134 views
3

我想通過駱駝路由在Weblogic JMS隊列中放置消息。從駱駝路由發送消息到Weblogic JMS隊列

我的目標是最終配置一個Route來使用jms隊列中的消息來發布早期路由中的數據。

這裏是我的配置:

<bean id="jndiTemplate" 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://localhost:7001</prop> 
      <!-- opional ... --> 
      <prop key="java.naming.security.principal">weblogic</prop> 
      <prop key="java.naming.security.credentials">weblogic</prop> 
     </props> 
    </property> 
</bean> 

<!-- Gets a Weblogic JMS Connection factory object from JDNI Server by jndiName--> 
<bean id="webLogicJmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiTemplate" ref="jndiTemplate" /> 
    <property name="jndiName" value="jms/TestConnectionFactory" /> <!-- the connection factory object is store under this name --> 
</bean> 

<!-- Create a new WebLogic Jms Camel Component --> 
<bean id="wmq" class="org.apache.camel.component.jms.JmsComponent"> 
    <property name="connectionFactory" ref="webLogicJmsConnectionFactory"/> 
</bean> 

我的路線是這樣的:

from("cxfrs:bean:rsServer") 
    .setBody().body(TestRequest.class) 
    .process(new Processor(){ 
     @Override 
     public void process(Exchange exchange) throws Exception { 
      TestRequest request = exchange.getIn().getBody(TestRequest.class); 
      TestResponse response = new TestResponse(); 
      response.setAddress(request.getAddress()); 
      response.setName(request.getName()); 
     } 

    }).to("wmq:queue:TestJMSQueue"); 

當我嘗試執行此路由我得到這個異常:

May 27, 2013 6:37:47 PM org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse 
WARNING: javax.ws.rs.WebApplicationException: org.springframework.jms.UncategorizedJmsException: Uncategorized exception occured during JMS processing; nested exception is weblogic.jms.common.JMSException: [JMSExceptions:045101]The destination name passed to createTopic or createQueue "TestJMSModule!TestJMSQueue" is invalid. If the destination name does not contain a "/" character then it must be the name of a distributed destination that is available in the cluster to which the client is attached. If it does contain a "/" character then the string before the "/" must be the name of a JMSServer or a ".". The string after the "/" is the name of a the desired destination. If the "./" version of the string is used then any destination with the given name on the local WLS server will be returned. 
at org.apache.camel.component.cxf.jaxrs.CxfRsInvoker.returnResponse(CxfRsInvoker.java:149) 
at org.apache.camel.component.cxf.jaxrs.CxfRsInvoker.asyncInvoke(CxfRsInvoker.java:104) 
at org.apache.camel.component.cxf.jaxrs.CxfRsInvoker.performInvocation(CxfRsInvoker.java:57) 
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96) 
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:167) 
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:94) 
at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58) 
at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor 
... 
Caused by: weblogic.jms.common.JMSException: [JMSExceptions:045101]The destination name passed to createTopic or createQueue "TestJMSModule!TestJMSQueue" is invalid. If the destination name does not contain a "/" character then it must be the name of a distributed destination that is available in the cluster to which the client is attached. If it does contain a "/" character then the string before the "/" must be the name of a JMSServer or a ".". The string after the "/" is the name of a the desired destination. If the "./" version of the string is used then any destination with the given name on the local WLS server will be returned. 
at weblogic.jms.frontend.FEManager.destinationCreate(FEManager.java:202) 
at weblogic.jms.frontend.FEManager.invoke(FEManager.java:544) 
at weblogic.messaging.dispatcher.Request.wrappedFiniteStateMachine(Request.java:961) 
at weblogic.messaging.dispatcher.DispatcherImpl.syncRequest(DispatcherImpl.java:184) 
at weblogic.messaging.dispatcher.DispatcherImpl.dispatchSyncNoTran(DispatcherImpl.java:287) 
at weblogic.jms.dispatcher.DispatcherAdapter.dispatchSyncNoTran(DispatcherAdapter.java:59) 
at weblogic.jms.client.JMSSession.createDestination(JMSSession.java:3118) 
at weblogic.jms.client.JMSSession.createQueue(JMSSession.java:2514) 

我按照程序創建一個Queue這裏提到:https://blogs.oracle.com/soaproactive/entry/how_to_create_a_simple

我正在創建一個JMS模塊(TestJMSModule),並在其中創建了一個Queue(TestJMSQueue)和一個連接工廠。

我是JMS的新手,我知道我在做駝峯側或Weblogic側的配置時出錯,但是無法弄清楚什麼。任何幫助將不勝感激。

在此先感謝。

回答

0

不幸的是,我不是WebLogic配置方面的專家。 客戶端配置看起來正確。 異常說明對象名稱不正確。 在你提到的例子中,隊列的jndi名稱是「jms/TestJMSQueue」,而不僅僅是「TestJMSQueue」。 對我來說,這意味着你應該使用.to("wmq:queue:jms/TestJMSQueue");來代替。

6

您需要創建一個JMS服務器。然後,您需要在JMS模塊中創建子部署,然後將子部署定位到JMS服務器。

那麼語法必須 JMSServer/JMSModule!隊列

+0

謝謝你的語法例子,一直推動我堅果。 – edclrk

+0

完美答案。面臨同樣的問題,在一秒鐘內解決。謝謝 !! – AnirbanDebnath

0

我是春天(4.1.6)+ Apache的駱駝(2.15.2)和使用消息從JMS隊列集成託管的Oracle WebLogic( 11克)。

的applicationContext.xml

<bean id="jndiTemplate" 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://localhost:7001</prop> 
      <prop key="java.naming.security.principal">weblogic</prop> 
      <prop key="java.naming.security.credentials">welcome1</prop> 
     </props> 
    </property> 
</bean> 

<bean id="webLogicJmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiTemplate" ref="jndiTemplate" /> 
    <!-- Connection factory JNDI name --> 
    <property name="jndiName" value="jms/TestConnectionFactory" /> 
</bean> 

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

<camel:camelContext id="camel" xmlns:camel="http://camel.apache.org/schema/spring"> 
    <!-- Route to copy files --> 
    <camel:route startupOrder="1"> 
     <camel:from uri="file:data/inbox?noop=true" /> 
     <camel:process ref="loggingProcessor" /> 
     <camel:to uri="file:data/outbox" /> 
    </camel:route> 

    <!-- Route to read from JMS and process them in jmsReaderProcessor --> 
    <camel:route startupOrder="2"> 
     <camel:from uri="weblogicJmsComponent:queue:TestJMSServer/TestJMSModule!TestJMSQueue" /> 
     <camel:process ref="jmsReaderProcessor" /> 
    </camel:route> 
</camel:camelContext> 

loggingProcessor和jmsReaderProcessor兩種駱駝處理器,只是註銷從Exchange對象/消息。

public void process(Exchange exchange) throws Exception { 
    LOG.info("begin process()"); 
    LOG.info("process() -- Got exchange: {}", exchange); 

    Message messageIn = exchange.getIn(); 
    LOG.info("process() -- Got messageIn: {}", messageIn); 

    LOG.info("process() -- Got messageIn.getBody(): {}", messageIn.getBody()); 

    Message messageOut = exchange.getOut(); 
    LOG.info("process() -- Got messageOut: {}", messageOut); 

    LOG.info("end process()"); 
} 

親切的問候,

克里斯蒂安Manoliu

相關問題