Apache CXF-JMS 3.0 и конфигурация Spring

Я пытаюсь настроить кэширование соединений JMS и параллелизм потребителей с Spring для выполнения некоторых нагрузочных тестов. XML контекста приложения приведен ниже.

<?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.versionJMSConfiguration1_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, но документация там, похоже, относится к версиям CXF до 3.0, потому что класс JMSConfiguration в 3.0 не имеет возможностей кэширования или параллелизма (нет сеттеров/ добытчики). Итак, я пытался использовать Spring для достижения того же результата, но безуспешно. В той же документации Spring DefaultMessageListenerContainer упоминается как контейнер для кэширования и конфигурации параллелизма, но мне не удалось найти примеры этого с интеграцией CXF, только для чистого JMS. Кроме того, DefaultMessageListenerContainer имеет установщик для регистрации JMS MessageListener. В случае CXF я обнаружил, что этот прослушиватель создается и управляется средой выполнения CXF и не предоставляется приложением.

Любой совет?

Спасибо!


person André Costa Lima    schedule 16.07.2014    source источник
comment
Вы уже решили эту проблему?   -  person Eernie    schedule 07.10.2014
comment
Взгляните на этот пост: stackoverflow.com/questions/27869370/   -  person André Costa Lima    schedule 09.02.2015


Ответы (2)


В настоящее время вы не можете установить одновременных потребителей для CXF 3. Я провел несколько тестов производительности с ActiveMQ и обнаружил, что производительность CXF 3 равна CXF 2 или даже лучше.

Причина в том, что теперь мы используем подход MessageListener вместо опроса, который делал Spring.

Посмотрите мой веб-сайт для тестов производительности.

person Christian Schneider    schedule 07.10.2014
comment
Сейчас это немного устарело. В грядущей версии CXF 3.1 вы снова можете использовать concurrentConsumers. В то время как производительность подхода MessageListener была хорошей для быстрой службы, она была довольно плохой для долго работающей службы. Он будет работать с JMSConfiguration, а также с конфигурацией на основе URI. - person Christian Schneider; 09.02.2015

Нам нужно иметь возможность настраивать одновременных и максимальных потребителей, чтобы мы могли справиться с нашей нагрузкой сообщений. Ограничение заключается в скорости обработки сообщений нашими приложениями; CXF не является узким местом. Планируется ли повторно ввести эти параметры в CXF? Можем ли мы настроить CXF для использования настроенного DefaultMessageListenerContainer?

person jamo    schedule 07.01.2015