java mina

Apache Mina與Spring MVC整合與快速建置

蔡志隆 2020/11/19 15:43:51
1379

一、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

 

 

蔡志隆