2013-04-01 2 views
1

Spring 구성을 사용하여 JMS 구성 요소를 배우기위한 명확하고 명확한 예제를 찾을 수 없습니다. 그래서 내가 이런 걸 쓴 :Camel JMS 구성 요소 (Weblogic 서버에서 Spring 포함)

<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 컨퍼런스가 참 (IP 포트 및 JNDI 이름). 연결이 끊어지고 세션이 있지만 예외가 발생합니다 누군가 내 실수를 말해 줄 수 있습니까?

탄원

편집 : Claus의 의견에 따라 수정.

답변

1

이 해결 방법으로 만 해결 예를 들어

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

즉 당신이 < 콩> 태그의 id 속성의 JMS 구성 요소를 지정한 이름이기 때문에

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

될 경우, . 그것은 지금 노력하고 있습니다

<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

Camel 끝점은 구성 요소 이름으로 "weblogic"을 참조해야합니다.

<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 조회가 어려워서 작동하지 않을 수 있습니다. weblogic 서버에 "jms/cdrPreMO-queue-jndi"라는 큐 이름이 있습니까? stacktrace가 JMS 대상을 찾고/작성하는 것 같습니다. –

0

질문이 꽤 오래되었지만이 오류가 발생하면 다른 사용자에게이 솔루션을 게시하십시오. weblogic 12c 버전에서 weblogic 큐를 검색하는 동안 Camel 2.19 버전에서이 문제가 발생했습니다. 여기에서 발생하는 조회는 Weblogic에서 대기열 목적지를 확인할 때 일반적인 JNDI 조회가 아닐 가능성이 큽니다. 다음과 같이 엔드 포인트 URI는 큐의 세부 사항을 포함해야한다 : 큐 이름이 모듈 이름 sample_jms_module와 JMS 서버에서 생성 TestRequestQueue 인 경우

jms_server_name/jms_module_name!queue_name 

는 예를 들어 웹 로직에 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:이라는 접두어로 선언해야합니다. 웹 로직에서 JMS 서버의

이름은 아래의 경로로 이동하여 웹 로직 콘솔에서 얻을 수 있습니다 서비스 -> 메시지 - 큐의> 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();