Apache Mina與Spring MVC整合與快速建置
一、Apache Mina簡介
Apache的Mina(Multipurpose Infrastructure Networked Applications)是一個網路應用框架,可以幫助使用者開發高效能和高擴充套件性的網路應用程式;它提供了一個抽象的、事件驅動的非同步API,使Java NIO在各種傳輸協議(如TCP/IP,UDP/IP協議等)下快速高效開發。
Apache Mina也稱為:
- NIO框架
- 客戶端/服務端框架(典型的C/S架構)
- 網路套接字(networking socket)類庫
- 事件驅動的非同步API(注意:在JDK7中也新增了非同步API)
總之:我們簡單理解它是一個封裝底層IO操作,提供高階操作API的通訊框架!
Mina架構
應用層次分為三部份:
- I/O Service (I/O 服務) - 具體 I/O 操作
- I/O Filter Chain (I/O 過濾器鏈) - 將字節過濾/轉換為想要的數據結構。反之亦然
- I/O Handler (I/O 處理器) - 這裡實現實際的業務邏輯
二、Mina快速建置與實作
Step1、下載Spring STS與解壓縮
本例以至Spring官網下載STS 3.7.3版 Base on Eclipse 4.5.2
連結:https://spring.io/tools3/sts/legacy
Step2、建立一Spring MVC專案
開啟STS後,點擊左上角 file > new > other,接著在Select a wizard視窗的Spring選項中選擇「Spring legacy Project」後點擊Next鈕
輸入Project Name,Templates選擇「Simple Spring Maven」後點擊Finish按鈕
Step3、pom.xml加入Mina需要的jar檔
在src/main/resources路徑下新增一spring-mina.xml,重點部份為粗體部份,需要實作一個handler。
需要加入的設定如下,:
<!--實現的handler -->
<bean id="serverHandler" class="com.java.demo.ServerHandler"/>
<!-- 建立服務器 -->
<bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor" init-method="bind"
destroy-method="unbind">
<property name="defaultLocalAddress" value=":8808"/>
<!--綁定要實現的handler -->
<property name="handler" ref="serverHandler"/>
<!--定義過濾器的集合 -->
<property name="filterChainBuilder" ref="filterChainBuilder"/>
<property name="reuseAddress" value="true"/>
</bean>
<!-- SessionConfig -->
<bean id="sessionConfig" factory-bean="ioAcceptor" factory-method="getSessionConfig">
<property name="bothIdleTime" value="10" />
<property name="readBufferSize" value="2048" />
</bean>
<!-- executorFilter多線程處理 -->
<bean id="executorFilter" class="org.apache.mina.filter.executor.ExecutorFilter"/>
<!-- 設定mdc操作過濾器 -->
<bean id="mdcInjectionFilter" class="org.apache.mina.filter.logging.MdcInjectionFilter">
<constructor-arg value="remoteAddress"/>
</bean>
<!-- 設定字符編碼過濾器 -->
<bean id="codecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter">
<constructor-arg>
<bean class="org.apache.mina.filter.codec.textline.TextLineCodecFactory" >
<constructor-arg index="0" type="java.nio.charset.Charset" value="UTF-8" />
</bean>
</constructor-arg>
</bean>
<!-- 設定日誌過濾器 -->
<bean id="loggingFilter" class="org.apache.mina.filter.logging.LoggingFilter"/>
<!-- 設定過濾器 -->
<bean id="filterChainBuilder"
class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">
<property name="filters">
<map>
<!--mina自帶的線程filter -->
<entry key="executor" value-ref="executorFilter" />
<entry key="mdcInjectionFilter" value-ref="mdcInjectionFilter" />
<!--日誌的filter -->
<entry key="loggingFilter" value-ref="loggingFilter" />
</map>
</property>
</bean>
Step4、實作Server端和Client端的Handler
我們建立一支 ServerHandler 的class檔並且實作IoHandlerAdapter介面
接著,我們再建立一支 ClientHandler 的class檔並且實作IoHandlerAdapter介面
最後,我們在建立一個Controller透過Web介面來測試Server是否在Tomcat啟動後就已在監聽中。
三、測試
將Tomcat啟動後,於瀏覽器輸入網址「http://localhost:8080/MinaDemo/views/myMain/sendMessage」測試透過console畫面來看看ServerHandler和ClientHandler的測試結果。
四、結語:
當專案若需使用Socket做通訊連接資料交換時,可透過Apache Mina已經包裝好的socket底層快速建置直接拿來使用即可,可縮短開發人員不需要特別自己寫一個Socket的呼叫方式來使用及反覆的測試。建置完成後亦可當作資料收集中心,收集各內部或第三方的不同類型資料,進而進行分類提供後續分析與處理。
參考來源:
https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/88329/
https://mina.apache.org/mina-project/userguide/ch17-spring-integration/ch17-spring-integration.html
https://blog.csdn.net/ihchenchen/article/details/69666854