2014-07-16 146 views
2

我試圖配置JMS連接緩存和消費者併發與Spring來執行一些負載測試。應用程序上下文xml如下。Apache CXF-JMS 3.0和彈簧配置

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

根據CXF文檔,從3.0,一個ConnectionFactoryFeature應當用來代替JMSConfigFeature,其被棄用(http://cxf.apache.org/docs/jms-transport.html)。我正在關注http://cxf.apache.org/scalable-cxf-applications-using-jms-transport.html提供的示例,但那裏的文檔似乎指的是早於3.0的CXF版本,因爲3.0中的JMSConfiguration類沒有緩存或併發能力(沒有setter/getters)。所以,我試圖用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中重新引入這些參數?我們可以配置CXF使用配置的DefaultMessageListenerContainer嗎?