From 4f99f59668c9160ca60958b7347944def26f2228 Mon Sep 17 00:00:00 2001 From: liurunyu <lry9898@163.com> Date: 星期日, 27 四月 2025 10:58:53 +0800 Subject: [PATCH] 回退配置 --- pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/channel/tcp/TcpUnit.java | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 167 insertions(+), 0 deletions(-) diff --git a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/channel/tcp/TcpUnit.java b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/channel/tcp/TcpUnit.java new file mode 100644 index 0000000..7528501 --- /dev/null +++ b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/channel/tcp/TcpUnit.java @@ -0,0 +1,167 @@ +package com.dy.common.mw.channel.tcp; + +import java.io.IOException; +import java.net.InetSocketAddress; + +import org.apache.mina.transport.socket.nio.NioSocketAcceptor; +import org.apache.mina.core.session.IdleStatus ; +import org.apache.mina.core.session.IoSession; +import org.apache.mina.transport.socket.SocketSessionConfig; +import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder ; +import org.apache.mina.filter.codec.ProtocolCodecFilter; +import org.apache.mina.filter.executor.ExecutorFilter ; + +import com.dy.common.mw.UnitAdapterInterface; +import com.dy.common.mw.UnitInterface; +import com.dy.common.mw.UnitCallbackInterface; + +@SuppressWarnings("unused") +public class TcpUnit implements UnitInterface { + + private static final TcpUnit instance = new TcpUnit() ; + private static boolean started = false ; + + private TcpUnitAdapter adapter ; + private TcpIoHandler tcpIoHandler ; + private DataCodecFactory dataCodecFactory ; + + private TcpUnit(){} ; + + public static TcpUnit getInstance(){ + return instance ; + } + + /** + * 鎶奍oSession浼氳瘽鐨処D灞炴�у強鍗忚鍚嶇О鐗堟湰鍙疯缃埌IoSession灞炴�т腑 + * @param session + * @param rtuAddr + * @param protocolName + * @param protocolVersion + * @throws Exception + */ + public void setIoSessionArrs(IoSession session, String rtuAddr, String protocolName, Short protocolVersion) throws Exception { + session.setAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrRtuAddr, rtuAddr) ; + session.setAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrProtocolName, protocolName) ; + session.setAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrProtocolVersion, protocolVersion) ; + } + + @Override + public void setAdapter(UnitAdapterInterface adapter) throws Exception { + if(adapter == null){ + throw new Exception("TCP妯″潡閫傞厤鍣ㄥ璞′笉鑳戒负绌猴紒") ; + } + this.adapter = (TcpUnitAdapter)adapter ; + TcpConfigVo vo = this.adapter.getConfig() ; + if(vo == null){ + throw new Exception("TCP妯″潡杩炴帴灞炴�ч厤缃璞′笉鑳戒负绌猴紒") ; + } + if(vo.port == null || vo.idle == null || vo.processors == null){ + throw new Exception("TCP妯″潡杩炴帴灞炴�ч厤缃璞″睘鎬у�间笉鑳戒负绌猴紒") ; + } + if(this.adapter.newPrefixedDataAvailableHandle() == null){ + throw new Exception("TCP妯″潡涓婅鏁版嵁瑙g爜绫讳负绌猴紒") ; + } + if(this.adapter.newSessionEventCallback() == null){ + throw new Exception("TCP妯″潡浜嬩欢澶勭悊鍥炶皟绫讳负绌猴紒") ; + } + } + /** + * 鍚姩妯″潡 + */ + public void start(UnitCallbackInterface callback) throws Exception { + if(!started){ + started = true ; + /** + * 寮傛闈為樆濉炵綉缁滈�氫俊鎺ユ敹鍣紝璐熻矗鎺ユ敹鑱旀帴璇锋眰 + * 鍚屾椂璁剧疆IoProcessor涓暟 + * 杩欎釜鍦版柟鐢ㄤ簬鎵ц鐪熸鐨処O 鎿嶄綔锛岄粯璁ゅ惎鐢ㄧ殑绾跨▼涓暟鏄疌PU 鐨勬牳鏁�+1锛岃濡傦細鍗旵PU 鍙� + * 鏍哥殑鐢佃剳锛岄粯璁ょ殑IoProcessor 绾跨▼浼氬垱寤�3 涓�傝繖涔熷氨鏄涓�涓狪oAcceptor 鎴栬�� + * IoConnector 榛樿浼氬叧鑱斾竴涓狪oProcessor 姹狅紝杩欎釜姹犱腑鏈�3 涓狪oProcessor銆傚洜涓篒O 鎿嶄綔 + * 鑰楄垂璧勬簮锛屾墍浠ヨ繖閲屼娇鐢↖oProcessor 姹犳潵瀹屾垚鏁版嵁鐨勮鍐欐搷浣滐紝鏈夊姪浜庢彁楂樻�ц兘銆傝繖涔熷氨 + * 鏄墠闈㈣鐨処oAccetor銆両oConnector 浣跨敤涓�涓猄elector锛岃�孖oProcessor 浣跨敤鑷繁鍗曠嫭鐨� + * Selector 鐨勫師鍥犮�� + * 閭d箞涓轰粈涔圛oProcessor 姹犱腑鐨処oProcessor 鏁伴噺鍙瘮CPU 鐨勬牳鏁板ぇ1 鍛紵鍥犱负IO 璇诲啓鎿� + * 浣滄槸鑰楄垂CPU 鐨勬搷浣滐紝鑰屾瘡涓�鏍窩PU 鍚屾椂鍙兘杩愯涓�涓嚎绋嬶紝鍥犳IoProcessor 姹犱腑鐨� + * IoProcessor 鐨勬暟閲忓苟涓嶆槸瓒婂瓒婂ソ銆� + */ + NioSocketAcceptor acceptor = new NioSocketAcceptor(this.adapter.getConfig().processors); + + SocketSessionConfig seConf = acceptor.getSessionConfig() ; + + /* 璁剧疆璇绘暟鎹椂涓�娆℃�х敵璇峰爢缂撳瓨澶у皬锛� + * 涓�鑸笉闇�瑕佽皟鐢ㄨ繖涓柟娉曪紝鍥犱负IoProcessor 浼氳嚜鍔ㄨ皟鏁寸紦鍐茬殑澶у皬銆� + * 鍙互璋冪敤setMinReadBufferSize()銆乻etMaxReadBufferSize()鏂规硶锛� + * 杩欐牱鏃犺IoProcessor濡備綍鑷姩璋冩暣锛岄兘浼氬湪浣犳寚瀹氱殑鍖洪棿銆� + */ + //seConf.setReadBufferSize(1024); + + //璁剧疆缃戠粶鑱旀帴绌洪棽鏃堕暱 + seConf.setIdleTime(IdleStatus.BOTH_IDLE, this.adapter.getConfig().idle); + + //寰楀埌缃戠粶 閫氫俊鏁版嵁杩囨护鍣ㄩ摼 + DefaultIoFilterChainBuilder chain = acceptor.getFilterChain() ; + //鐢熸垚缂栬В鐮佽繃婊ゅ櫒宸ュ巶绫� + dataCodecFactory = new DataCodecFactory(this.adapter) ; + //璁剧疆鈥減rotocol鈥濓紝鍔犲叆缂栬В鐮佽繃婊ゅ櫒锛岃繃婊ゅ櫒鍦↖oProcessor绾跨▼涓墽琛� + chain.addLast("protocol", new ProtocolCodecFilter(dataCodecFactory)); + + /* + * 涓�鑸珽xecutorFilter 閮借鏀惧湪ProtocolCodecFilter杩囨护鍣ㄧ殑鍚庨潰锛� + * 涔熷氨鏄缂栬В鐮佽繍琛屽湪IoProcessor鎵�鍦ㄧ殑绾跨▼锛屽洜涓虹紪瑙g爜澶勭悊鐨勬暟鎹兘鏄� + * 鐢盜oProcessor璇诲彇鍜屽彂閫佺殑锛屾病蹇呰寮�鍚柊鐨勭嚎绋嬶紝鍚﹀垯鎬ц兘鍙嶈�屼細涓嬮檷銆� + * ExecutorFilter杩囩▼鍣ㄤ細鍚姩涓�涓嚎绋嬫睜锛屽鐞嗗悗缁唬鐮侀�昏緫銆� + * 涓�鑸娇鐢‥xecutorFilter鐨勫吀鍨嬪満鏅槸灏嗕笟鍔¢�昏緫锛堣濡傦細鑰楁椂鐨勬暟鎹簱鎿嶄綔锛� + * 鏀惧湪鍗曠嫭鐨勭嚎绋嬩腑杩愯锛屼篃灏辨槸璇翠笌IO澶勭悊鏃犲叧鐨勬搷浣滃彲浠ヨ�冭檻浣跨敤ExecutorFilter鏉ュ紓姝ユ墽琛屻�� + * 鏈鐢ㄦ硶锛屼娇ExecutorFilter绾跨▼姹犱腑鐨勭嚎绋嬪鐞咺OHandler锛圱cpIoHandler锛夋搷浣� + */ + chain.addLast("exceutor", new ExecutorFilter()); + + //涓氬姟閫昏緫澶勭悊鍣紝璐熻矗澶勭悊缃戠粶浼氳瘽鍙婅緭鍏ヨ緭鍑烘暟鎹� + tcpIoHandler = new TcpIoHandler(this.adapter) ; + acceptor.setHandler(tcpIoHandler) ; + + boolean isException = false ; + try { + acceptor.bind(new InetSocketAddress(this.adapter.getConfig().port)); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("TCP閫氫俊妯″潡鍚姩澶辫触锛�" + (e.getMessage()==null?"":e.getMessage())); + isException = true ; + }finally{ + ; + } + + if(!isException){ + if(this.adapter.getConfig().showStartInfo != null && this.adapter.getConfig().showStartInfo.booleanValue()){ + System.out.println("TCP妯″潡鎴愬姛鍚姩锛岀鍙o細" + this.adapter.getConfig().port); + } + } + + callback.call(null); + } + } + + /** + * 鍋滄妯″潡杩愯锛屽皢涓嶅啀鎺ュ叆TCP缃戠粶杩炴帴锛屽苟鎶婂凡缁弔cp杩炴帴鐨勫叏閮ㄦ柇杩炴帴 + * @param callback + * @throws Exception + */ + @Override + public void stop(UnitCallbackInterface callback) throws Exception { + this.tcpIoHandler.stop(); + this.dataCodecFactory.stop(); + this.adapter.newUnitStopCallback().callback(); + callback.call(null); + } + + /** + * 瑙i櫎鍋滄锛屾仮澶峊CP鏈嶅姟杩愯 + * @throws Exception + */ + public void recover() throws Exception { + this.tcpIoHandler.recover(); + this.dataCodecFactory.recover(); + } + + +} -- Gitblit v1.8.0