2014-07-16 3 views
2

일부로드 테스트를 수행하기 위해 Spring과 JMS 연결 캐싱 및 소비자 동시성을 구성하려고합니다. 응용 프로그램 컨텍스트 xml은 아래와 같습니다. 3.0 CXF 문서에 따라 Apache CXF-JMS 3.0 및 Spring 구성

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:cxf="http://cxf.apache.org/core" 
    xmlns:jaxws="http://cxf.apache.org/jaxws" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:soap="http://cxf.apache.org/bindings/soap" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd 
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> 

    <context:annotation-config /> 

    <bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
     <property name="brokerURL" value="tcp://172.18.2.100:8080"/> 
    </bean> 

    <bean id="clientCachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> 
     <property name="targetConnectionFactory" ref="amqConnectionFactory"/> 
     <property name="sessionCacheSize" value="20"/> 
     <property name="cacheProducers" value="true"/> 
    </bean> 

    <bean id="clientContainerListener" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
     <property name="connectionFactory" ref="clientCachingConnectionFactory" /> 
     <property name="destinationName" value="test.load.outside.multispeak.ch.queue" /> 
    </bean> 

    <jaxws:client 
     id="load-test-multispeak-ch-client" 
     xmlns:ns="http://www.multispeak.org/Version_4.1_Release" 
     serviceClass="org.multispeak.version_4_1_6.CH.CHServerSoap" 
     serviceName="ns:CH_Server" 
     endpointName="ns:CH_ServerSoap" 
     address="jms://" 
     wsdlLocation="classpath:CH_Server.wsdl"> 
     <jaxws:features> 
      <bean class="org.apache.cxf.transport.jms.ConnectionFactoryFeature"> 
       <constructor-arg index="0" ref="clientCachingConnectionFactory"/> 
      </bean> 
     </jaxws:features> 
    </jaxws:client> 

    <bean id="serverCachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> 
     <property name="targetConnectionFactory" ref="amqConnectionFactory"/> 
     <property name="sessionCacheSize" value="20"/> 
     <property name="cacheConsumers" value="true"/> 
    </bean> 

    <bean id="serverContainerListener" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
     <property name="connectionFactory" ref="serverCachingConnectionFactory" /> 
     <property name="destinationName" value="test.load.outside.multispeak.ch.queue" /> 
     <property name="cacheLevel" value="3" /> 
     <property name="concurrentConsumers" value="10" /> 
     <property name="maxConcurrentConsumers" value="50" /> 
    </bean> 

    <jaxws:endpoint 
     id="load-test-multispeak-ch-server" 
     xmlns:tns="http://www.multispeak.org/Version_4.1_Release" 
     implementor="pt.fraunhofer.outside.multispeak.ch.server.CHServerSoapImpl" 
     serviceName="tns:CH_Server" 
     endpointName="tns:CH_ServerSoap" 
     publish="false" 
     address="jms://" 
     wsdlLocation="classpath:CH_Server.wsdl"> 
     <jaxws:features> 
      <bean class="org.apache.cxf.feature.LoggingFeature"/> 
      <bean class="org.apache.cxf.transport.jms.ConnectionFactoryFeature"> 
       <constructor-arg index="0" ref="serverCachingConnectionFactory"/> 
      </bean> 
     </jaxws:features> 
    </jaxws:endpoint> 

가하는 ConnectionFactoryFeature 대신되지 않은 JMSConfigFeature ( http://cxf.apache.org/docs/jms-transport.html)로 사용되어야한다. 나는 http://cxf.apache.org/scalable-cxf-applications-using-jms-transport.html에 제공된 예제를 따르고 있었지만 3.0에서 JMSConfiguration 클래스의 캐싱 또는 동시성 기능 (setter/getters 없음)이 없으므로 3.0 이전의 CXF 버전을 참조하는 것으로 보입니다. 그래서, 나는 같은 결과를 얻기 위해 Spring을 사용하려했지만 성공하지 못했습니다. 매우 동일한 문서는 캐싱 및 동시성 구성을위한 컨테이너로서 Spring DefaultMessageListenerContainer을 참조하지만 CXF 통합으로 순수 JMS에 대한 예제를 찾을 수 없었다. 또한 DefaultMessageListenerContainer에는 JMS MessageListener을 등록하는 설정자가 있습니다. CXF의 경우 CXF 런타임에서 리스너를 만들고 관리하며 응용 프로그램에서 제공하지는 않습니다.

어떤 조언이 필요합니까?

감사합니다.

+0

이 문제를 해결 했습니까? – Eernie

+0

이 게시물을보십시오 : http://stackoverflow.com/questions/27869370/apache-cxf-3-jms-support-for-multiple-concurrent-consumers/ – acostalima

답변

0

현재 CXF 3의 동시 사용자를 설정할 수 없습니다. ActiveMQ로 성능 테스트를 수행했으며 CXF 3의 성능이 CXF 2 이상인지 확인했습니다.

이유는 우리가 이제는 봄에 수행 한 폴링 대신 MessageListener 방식을 사용하기 때문입니다.

See my website for the performance tests.

+0

이것은 약간 구식입니다. CXF 3.1에서 concurrentConsumers를 다시 사용할 수 있습니다. MessageListener 접근법의 성능은 빠른 서비스에 좋았지 만 장기 실행 서비스에는 상당히 나빴습니다. JMSConfiguration 및 URI 기반 구성과 함께 작동합니다. –

0

우리는 메시지 부하를 처리 할 수 ​​있도록 동시 및 최대 소비자를 조정할 수 있어야합니다. 제약 조건은 응용 프로그램의 메시지 처리 속도에 있습니다. CXF는 병목 현상이 아닙니다. CXF에서 이러한 매개 변수를 다시 도입 할 계획입니까? 구성된 DefaultMessageListenerContainer를 사용하도록 CXF를 구성 할 수 있습니까?