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-aop(aop支持) app
spring-beans(配置spring bean必須的包) frontend
spring-context(應用上下文支持,必須) tcp
spring-core(spring核心的包,包括io操做,cglib等) this
spring-experssion(多是xml解析相關的包,不要的話XmlWebApplicationContext沒法啓動)
spring-jms(jms支持)
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專門用於支持JMS。JmsTemplate雖然簡化了JMS操做,但這個坑爹貨每次發送消息時,默認都會創建新的connection,session和producer,而且發送完成後關閉。,這樣的效率很低
若是不是使用的JCA容器來管理JMS鏈接,能夠使用AMQ的poolingJMS鏈接。
首先,配置鏈接工廠:
<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是發送模式(persistent或nonpersistent),要設置QOS參數必須得啓用explicitQosEnabled;
調用jmsTemplate的receive時默認是阻塞,能夠設置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實現;jaxws:endpoint中,id是bean的名字,implementor是具體的實現,address就是web service的訪問地址。
3. web.xml文件到配置
若是經過web容器發佈服務,在web.xml文件中的配置包括spring和cxf。
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>