Spring和Apache CXF,ActiveMQ整合記錄

Spring 3.2.8 web

Apache CXF 1.6 spring

ActiveMQ 5.9.0 apache

Tomcat 8.0.3 api

MyEclipse 2013 安全

1. Spring須要的jar包: session

    spring-aopaop支持) app

    spring-beans(配置spring bean必須的包) frontend

    spring-context(應用上下文支持,必須) tcp

    spring-corespring核心的包,包括io操做,cglib等) this

    spring-experssion(多是xml解析相關的包,不要的話XmlWebApplicationContext沒法啓動)

    spring-jmsjms支持)

    spring-web(在web容器中啓動)

    spring-tx(事務支持)


    其中,spring-tx,spring-aop不是必選,根據須要。

2. CXF須要的jar包:

    cxf-api

    cxf-rt-bindings-soap

    cxf-rt-bindings-xml

    cxf-rt-core

    cxf-rt-databinding-jaxb

    cxf-rt-frontend-jaxws

    cxf-rt-frontend-simple

    cxf-rt-transports-http

    org-apache-servicemix-bundles-wsdl4j

    org-apache.servicemix-specs-jaxws-api

    stax2-api

    woodstox-core-asl

    xml-schema-core

    asm(貌似須要到第三方下載)

    cxf最坑爹。要麼把全部jar包都加進去,確定不出錯,要麼根據運行時的錯誤一個一個添加。

3. ActiveMQ

    activemq-all

    activemq-jms-pool

    activemq-pool

    commons-logging

    commons-pool



    其它的jar包也是根據需求添加。

1. Spring整合ActiveMQ

    Spring有個JmsTemplate專門用於支持JMSJmsTemplate雖然簡化了JMS操做,但這個坑爹貨每次發送消息時,默認都會創建新的connectionsessionproducer,而且發送完成後關閉。,這樣的效率很低

    若是不是使用的JCA容器來管理JMS鏈接,能夠使用AMQpoolingJMS鏈接。

    首先,配置鏈接工廠:

<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">

    <property name="connectionFactory">

        <bean class="org.apache.activemq.ActiveMQConnectionFactory">

            <property name="brokerURL">

                <value>tcp://192.168.1.156:61616</value>

            </property>

        </bean>

    </property>

</bean>

    根據鏈接工廠配置jmsTemplate

<!-- Spring JMS Template 線程安全,因此只須要配置一個實例-->

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">

        <property name="connectionFactory">

            <ref local="jmsFactory"/>

        </property>

    <!-- 啓用QOS -->

    <property name="explicitQosEnabled"><value>1</value></property>

    <!-- 設置消息在broker中保存的最長時間-->

    <property name="timeToLive"><value>5000</value></property>

    <!-- 設置爲NONPERSISTENT -->

    <property name="deliveryMode"><value>1</value></property>

    <!-- 接收數據的超時時間 -->

    <property name="receiveTimeout"><value>5000</value></property>

</bean>


    其中QOS參數timeToLive表示發送的消息在broker保存的最長時間delievryMode是發送模式(persistentnonpersistent,要設置QOS參數必須得啓用explicitQosEnabled

    調用jmsTemplatereceive時默認是阻塞,能夠設置receiveTimeout表示接收數據的超時時間。

    若是採用消息監聽接收消息,須要配置MessageListener。首先是實現本身的消息監聽類,再配置jmsContainer

    <!-- this is the Message Driven POJO (MDP) -->

    <bean id="messageListener" class="com.swiee.controller.ElecMessageListener" />

    <!-- and this is the message listener container -->    

    <bean id="jmsContainer"             class="org.springframework.jms.listener.DefaultMessageListenerContainer">

            <property name="connectionFactory">

                <ref local="jmsFactory"/>

              </property>

            <property name="destination" ref="consumerDest"/>

            <property name="messageListener" ref="messageListener" />

            <property name="sessionTransacted" value="true"/>

        </bean>



2. Spring整合CXF


        這個比我想象中簡單不少。

        在spring的配置文件,或者單獨的xml文件中,beans的命名空間加上

        xmlns:jaxws="http://cxf.apache.org/jaxws"

        xsi:schemaLocation="

        http://cxf.apache.org/jaxws

       http://cxf.apache.org/schemas/jaxws.xsd"

        而後就能夠在配置文件中添加本身的ws相關的bean

        <bean id="hello" class="com.swiee.webservice.impl.HelloWorldImpl" />

        <jaxws:endpoint id="helloWorld" implementor="#hello" address="/HelloWorld" />


        其中hello這個bean就是具體的web service實現;jaxwsendpoint中,idbean的名字,implementor是具體的實現,address就是web service的訪問地址。


3. web.xml文件到配置


    若是經過web容器發佈服務,在web.xml文件中的配置包括springcxf

    spring設定監聽器或servlet(兼容早期版本風格)啓動spring應用上下文:

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>classpath:applicationContext.xml</param-value>

        </context-param>

    <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>


CXF使用servlet暴露web service

    <servlet>

        <description>Apache CXF Endpoint</description>

        <servlet-name>cxf</servlet-name>

        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>cxf</servlet-name>

        <url-pattern>/*</url-pattern>

    </servlet-mapping>

相關文章
相關標籤/搜索