2014-07-16 176 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吗?