| | |
| | | //断包了 |
| | | return false ; |
| | | }else if(dataStatus.isCompleted() || dataStatus.isAdjoined()){ |
| | | //本包数据已经全部接收,并且可能粘有下包数据 |
| | | //本包数据已经全部接收,或可能粘有下包数据 |
| | | this.nextDeal(in, dataStatus.getDataLen(), out) ; |
| | | if(dataStatus.isAdjoined()){ |
| | | //说明粘包了,还有数据,需要对这些数据再次执行doDecode_方法. |
| | |
| | | |
| | | //得到网络 通信数据过滤器链 |
| | | DefaultIoFilterChainBuilder chain = acceptor.getFilterChain() ; |
| | | //编解码过滤器 |
| | | //生成编解码过滤器工厂类 |
| | | dataCodecFactory = new DataCodecFactory(this.adapter) ; |
| | | //设置“protocol”,加入编解码过滤器,过滤器在IoProcessor线程中执行 |
| | | chain.addLast("protocol", new ProtocolCodecFilter(dataCodecFactory)); |
| | | |
| | | /* |
| | | * 一般ExecutorFilter 都要放在ProtocolCodecFilter 过滤器的后面, |
| | | * 也就是不要让编解码运行在独立的线程上,而是要运行在IoProcessor 所在的线程, |
| | | * 因为编解码处理的数据都是由IoProcessor 读取和发送的,没必要开启新的线程, |
| | | * 否则性能反而会下降。一般使用ExecutorFilter 的典型场景是将业务逻辑(譬如:耗时的数据库操作) |
| | | * 放在单独的线程中运行,也就是说与IO 处理无关的操作可以考虑使用ExecutorFilter 来异步执行。 |
| | | * 一般ExecutorFilter 都要放在ProtocolCodecFilter过滤器的后面, |
| | | * 也就是让编解码运行在IoProcessor所在的线程,因为编解码处理的数据都是 |
| | | * 由IoProcessor读取和发送的,没必要开启新的线程,否则性能反而会下降。 |
| | | * ExecutorFilter过程器会启动一个线程池,处理后续代码逻辑。 |
| | | * 一般使用ExecutorFilter的典型场景是将业务逻辑(譬如:耗时的数据库操作) |
| | | * 放在单独的线程中运行,也就是说与IO处理无关的操作可以考虑使用ExecutorFilter来异步执行。 |
| | | * 本处用法,使ExecutorFilter线程池中的线程处理IOHandler(TcpIoHandler)操作 |
| | | */ |
| | | chain.addLast("exceutor", new ExecutorFilter()); |
| | | |
| | |
| | | //RTU日志文件存储目录(相对目录) |
| | | resVo.rtuLogDir = conf.getSetAttrTxt(doc, "config.resource", "rtuLogDir", null, false, null) ; |
| | | //RTU日志文件最大字节数(KB) |
| | | resVo.rtuLogFileMaxSize = conf.getSetAttrPlusInt(doc, "config.resource", "rtuLogFileMaxSize", null, 100000, 2000000, null) ; |
| | | resVo.rtuLogFileMaxSize = conf.getSetAttrPlusInt(doc, "config.resource", "rtuLogFileMaxSize", null, 10, 2000000, null) ; |
| | | //RTU日志文件最大文件数 |
| | | resVo.rtuLogFileMaxCount = conf.getSetAttrPlusInt(doc, "config.resource", "rtuLogFileMaxCount", null, 1, 10, null) ; |
| | | |