java - Apache CXF-JMS 3.0 和 Spring 配置

标签 java cxf spring-jms

我正在尝试使用 Spring 配置 JMS 连接缓存和消费者并发以执行一些负载测试。应用程序上下文 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.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 类没有缓存或并发能力(没有 setters/getters)。所以,我试图使用 Spring 来实现相同的结果,但没有成功。完全相同的文档将 Spring DefaultMessageListenerContainer 称为缓存和并发配置的容器,但我无法找到与 CXF 集成的示例,仅适用于纯 JMS。此外,DefaultMessageListenerContainer 有一个 setter 来注册 JMS MessageListener。在 CXF 的情况下,我发现该监听器是由 CXF 运行时创建和管理的,而不是由应用程序提供的。

有什么建议吗?

谢谢!

最佳答案

目前您不能为 CXF 3 设置并发消费者。我用 ActiveMQ 做了一些性能测试,发现 CXF 3 的性能等于 CXF 2 甚至更好。

原因是我们现在使用 MessageListener 方法而不是 spring 所做的轮询。

See my website for the performance tests .

关于java - Apache CXF-JMS 3.0 和 Spring 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24785219/

相关文章:

java - 将 System.out.println 重定向到日志

Java TableModel 实现导致程序崩溃

java - 我无法从 DialogFragment 中的 EditText 对象中获取文本(获取空字符串,即 "")

java - CXF BusException 命名空间 http ://cxf. 没有 DestinationFactory apache.org/transports/http

java - 使用 Apache CXF 为 SOAP 客户端指定 SSLContext

java - Setsessiontransacted 如何在具有 Pub/sub 模型的 JMSTemplate 和 DefaultMessageListenerContainer 中工作

java - 如何安全地关闭 GenericKeyedObjectPool?

java - 如何防止 CXF 日志记录?

java - Spring JMS 监听器即使在异常时也承认

spring - 如何防止 Spring JmsTemplate 单元测试在读取 ActiveMQ 队列时阻塞?