| <?xml version="1.0" encoding="UTF-8"?> | 
| <config> | 
|     <server name="通信中间件" showStartInfo="true" company="http://www.dyjs.com"/> | 
|     <!-- | 
|     基本配置 | 
|     orgTag 机构tag(对应机构tag,和数据源后缀) | 
|     isLowPower: 是否为低功耗 | 
|     onlyDealRtus:只处理指定RTU地址设备,其他设备数据丢弃,多个RTU地址用英文逗号隔开, | 
|     onlyOneProtocol:在支持多通信协议时,只有RTU上线了,才能识别出该RTU实际用的通信协议,进而用此协议解析上行数据及构造下行命令。 | 
|                      如果RTU未曾上线(通信中间件启动后该RTU未曾上线),那么在向它发送下行命令时,不能判断出其采用的协议,也不能构造命令,尤其是低功耗情况下,不上线是正常现象。 | 
|                      当只有一个协议情况下,在RTU未曾上线时,也能用此协议构造命令并缓存下来,尤其适合低功耗情况。 | 
|     onlyOneProtocol=true: 通信中间件当前只有一个协议 | 
|     downComandMaxResendTimes: 下行命令允许发送的最大次数X,即允许重发X-1 | 
|     commandSendInterval: 针对一个RTU,下发命令的时间间隔(秒) | 
|     fastCommandSendInterval: 针对一个RTU,下发快速命令(如升级命令)的时间间隔(毫秒),此配置作用力受下面配置项lastUpDataTimeLive限制 | 
|     cacheWaitResultTimeout: 命令已经发送达最大次数,仍未收到命令结果,需要在缓存继续等待,其等待最大时长(秒),本系统RTU,对于开关泵命令,其先执行开关泵报,然后再进行命令应答,所以此值 要大一些 | 
|     offLineCacheTimeout: 不在线缓存的命令最大缓存时长(秒) | 
|     lastUpDataTimeLive: TCP上行数据时刻缓存时长(毫秒),当达到时长时,TCP上行数据时刻被清空,采用TCP上行数据时刻目的是,阻止上行数据同时下发数据,因为RTU处理不过来 | 
|     dbDataIdSuffix:数据库数据id生成器的id后缀,0是默认的后缀,一般web系统应用,数据中间件id后缀大于等于1 | 
|     cacheUpDownDataWarnCount:上下行数据缓存队列中缓存数据个数的报警量,这个与现实项目所接水表数相关 | 
|     cacheUpDownDataMaxCount:上下行数据缓存队列中缓存数据个数的最大值,这个与现实项目所接水表数相关 | 
|     disconnectedByNoUpDataMinutes:没有上行数据的分钟数,达到这个分钟数,认为RTU断网了,取值范围是2-100 | 
|     workReportDealOneByTimes: 工作报太频繁,N次上报处理1次,取值范围是1-100 | 
|     intakeAlarmLossMinValue: 触发发送钉钉报警消息的取水口日漏损量的最小值(包括但除0.0外)(小数) | 
|     sendDingDingAlarmMsInterval: 有报警发生时,向钉钉发送消息的间隔时长(分钟) | 
|      --> | 
|     <base | 
|             orgTag="${base.orgTag}" | 
|             isLowPower="false" | 
|             onlyDealRtus="" | 
|             onlyOneProtocol="false" | 
|             downComandMaxResendTimes="1" | 
|             commandSendInterval="3" | 
|             fastCommandSendInterval="500" | 
|             cacheWaitResultTimeout="120" | 
|             offLineCacheTimeout="86400" | 
|             lastUpDataTimeLive="500" | 
|             dbDataIdSuffix="0" | 
|             cacheUpDownDataWarnCount="100000" | 
|             cacheUpDownDataMaxCount="110000" | 
|             disconnectedByNoUpDataMinutes="${base.upData.min.interval}" | 
|             workReportDealOneByTimes="1" | 
|             intakeAlarmLossMinValue="1.0" | 
|             sendDingDingAlarmMsInterval="60" | 
|     /> | 
|   | 
|     <!-- | 
|     2024-08-22 此配置暂时未应用 | 
|     centerAddr: 中心地址,当前,centerAddr未用到 | 
|     synchroRtuClock: 是否对RTU校时 | 
|     synchroRtuClockTimepieces:当RTU与服务器时钟相差一定毫秒(配置文件是秒钟)后,进行校时 | 
|      --> | 
|     <protocol | 
|             centerAddr="1" | 
|             synchroRtuClock="true" | 
|             synchroRtuClockTimepieces="300000" | 
|     /> | 
|   | 
|     <!-- RTU 消息中心 | 
|     enable: 模块是否启动 | 
|     notifyInterval: 消息通知间隔(秒) | 
|     --> | 
|     <msCenter enable="true" | 
|               notifyInterval="5" | 
|     /> | 
|   | 
|     <!-- RTU 软件升级 | 
|     enable: 模块是否启动 | 
|     openNoUpgrade: 阀开(泵开)不执行升级 | 
|     lastOpenMaxGoOn: 阀开(泵开)状态设置以来持续最长时间(秒钟),超过这个时间认为状态无效(这个时长取决于工作报间隔) | 
|     noOneRtuUpgradeMaxDuration:升级任务设置后,无一设备升级最大时长(秒),超过这个时长,认为升级任务完成,取值范围是5分钟~60分钟 | 
|     runningAndIdleDuration:rtu升级启动后进入升级中状态,但某种情况下RTU不再通信了,一直处于等待状态,等待达到一定时长(秒,一般与noOneRtuUpgradeMaxDuration相等)认为升级失败(一包死或多包死),取值范围是5分钟~60分钟 | 
|     failTryTimes:升级失败后(针对的是在线进行了升级下发命令),重新偿试升级次数,当设置为0时表示不重新偿试升级 | 
|     ugMaxRtuAtOnce:为了缓解通信中间件的压力,同时支持升级的RTU台数,当设置为0时表示不受限制 | 
|     rtuOffLineWaitDuration: rtu离线,等待其升级的时长(秒),超过这个时间,设置其升级失败,且设置升级任务完成 | 
|     notifyStateInterval: 升级状态通知间隔(秒) | 
|     notifyTimesAfterOver: 升级结束后,再向web服务系统通知状态的次数 | 
|     --> | 
|     <upgrade enable="true" | 
|              openNoUpgrade="true" | 
|              lastOpenMaxGoOn="1800" | 
|              noOneRtuUpgradeMaxDuration="1200" | 
|              runningAndIdleDuration="1200" | 
|              failTryTimes="2" | 
|              ugMaxRtuAtOnce="5000" | 
|              rtuOffLineWaitDuration="1800" | 
|              notifyStateInterval="2" | 
|              notifyTimesAfterOver="1" | 
|     /> | 
|   | 
|   | 
|     <!-- | 
|     支持模块 | 
|     短工作时长线程池,线程负责用时较短的工作任务 | 
|     short_maxThread: 池中最大线程数为所有CPU核数+1(short池与long池各分一半),若为-1,不受限制 ,设置为0,表示不启动线程池 | 
|     short_minThread: 池中最小线程数,若为-1,不受限制,设置为0,表示不启动线程池 | 
|     short_freeTimeout: 线程数空闲时长,若池中线程数量大于minThread,且有的线程空闲时长超过freeTimeout,则清除该线程,为了不清除,把minThread与maxThread设置相等 | 
|     short_busyTimeout:线程不间断工作时长(单位为秒)超时限,认为线程已经了崩溃,将强制清除,短工作时长设置为5秒 | 
|     长工作时长线程池,线程负责用时较长的工作任务,例如数据库存取操作 | 
|     long_maxThread: 池中最大线程数为所有CPU核数+1(short池与long池各分一半),若为-1,不受限制,设置为0,表示不启动线程池 | 
|     long_minThread: 池中最小线程数,若为-1,不受限制,设置为0,表示不启动线程池 | 
|     long_freeTimeout: 线程数空闲时长,若池中线程数量大于minThread,且有的线程空闲时长超过freeTimeout,则清除该线程 | 
|     long_busyTimeout:线程不间断工作时长(单位为秒)超时限,若为-1,不受限制 | 
|     enableThreadPool:是否启用线程池 | 
|      --> | 
|     <support | 
|             short_maxThread="6" | 
|             short_minThread="6" | 
|             short_freeTimeout="60" | 
|             short_busyTimeout="5" | 
|             long_maxThread="6" | 
|             long_minThread="6" | 
|             long_freeTimeout="60" | 
|             long_busyTimeout="-1" | 
|             enableThreadPool="true" | 
|     /> | 
|   | 
|     <!-- | 
|     资源模块 | 
|     rtuLogDir:RTU日志文件存储目录(相对目录) | 
|     rtuLogFileMaxSize:RTU日志文件最大字节数(B) | 
|     rtuLogFileMaxCount:RTU日志文件最大文件数 | 
|     monitorInterval:Rtu状态监视间隔(分钟) | 
|     saveDbInterval:Rtu状态存数据库间隔(分钟) | 
|      --> | 
|     <resource | 
|             rtuLogDir="rtuLogs/" | 
|             rtuLogFileMaxSize="1000000" | 
|             rtuLogFileMaxCount="3" | 
|             monitorInterval="2" | 
|             saveDbInterval="10" | 
|     /> | 
|   | 
|   | 
|     <!-- | 
|     2024-08-22 此配置暂时未应用 | 
|     port:rmi服务端口号 | 
|     context:rmi服务上下文 | 
|      --> | 
|     <rmi enable="true" | 
|          port="65400" | 
|          context="rtuMw" | 
|     /> | 
|   | 
|     <!-- | 
|     coreInterval:主线程每次执行间隔时长(毫秒) | 
|     queueWarnSize: 缓存队列节点数警告数量 | 
|     queueMaxSize: 缓存队列节点数最大数量 | 
|      --> | 
|     <core | 
|             coreInterval="100" | 
|             queueWarnSize="100000" | 
|             queueMaxSize="300000" | 
|     /> | 
|   | 
|     <!-- | 
|     port:端口 | 
|     processors: Mina IO 处理上下行数据的线程数,一般是CPU总核数+1 | 
|     idle: 发呆时长(秒) | 
|      --> | 
|     <tcp enable="true" | 
|          port="${tcp.port}" | 
|          processors="3" | 
|          idle="10" | 
|     /> | 
|   | 
|   | 
|     <!-- | 
|     enable 是否启动 | 
|     svIp MQTT服务器IP | 
|     svUserName MQTT服务器用户名 | 
|     svUserPassword MQTT服务器用户密码 | 
|     poolMaxSize 连接池最大连接数 | 
|     sendInterval 命令发送间隔(单位秒),取值范围是1~3600 | 
|     reSendTimesByNoResult 未收到命令结果时,最大重复发送次数,取值范围是0~100, 0时表示不重复发送 | 
|     comCacheTimeout: 命令最大缓存时长(秒),取值范围是1~3600 | 
|     acceptDataMinInterval:因为上行数据密度较大(如10秒上行一条数据),数据处理与存储压力大,所以最小间隔一定时间(分钟)真正接收处理一条上行数据 | 
|     useMemoryPersistence 使用内存持久化而非默认的文件持久化(true是 false否) | 
|     protocolAndDeviceIds 在子系统(orgTag)中接入的设备(FBox)所用协议及设备id集合,多个用逗号隔开,协议与ID用正斜杠隔开,例如:sd1/338220031439,sd1/338220031440 | 
|     subTopicAndQos: 订阅主题与Qos,主题名与其Qos用逗号隔开,多个主题及Qos用分号隔开,例如:ym/topic1,1;ym/topic2,1;ym/topic3,1,如果有多个OrgTag,主题前缀用其OrgTag | 
|     pubTopicQos: 发布主题的Qos,取值范围: | 
|         0    至多一次(At most once)    消息发送后不保证到达,可能丢失或重复,开销最小,可靠性最低。 | 
|         1    至少一次(At least once)    消息至少会到达一次,可能重复,但不会丢失,可靠性中等,适用于多数场景。 | 
|         2    恰好一次(Exactly once)    消息仅会到达一次,不重复且不丢失,可靠性最高,但开销最大,实现最复杂。 | 
|     noSubThenOff: MQtt设备在一定时间(分钟)后未发布消息,认为设备离线 | 
|      --> | 
|     <mqtt enable="${mqtt.enable}" | 
|           svIp="${mqtt.ip}" | 
|           svPort="${mqtt.port}" | 
|           svUserName="${mqtt.user}" | 
|           svUserPassword="${mqtt.password}" | 
|           poolMaxSize="10" | 
|           sendInterval="60" | 
|           reSendTimesByNoResult="0" | 
|           comCacheTimeout="30" | 
|           acceptDataMinInterval="60" | 
|           useMemoryPersistence="true" | 
|           protocolAndDeviceIds="${mqtt.protocolAndDeviceIds}" | 
|           subTopicAndQos="${mqtt.subTopicAndQos}" | 
|           pubTopicQos="1" | 
|           noSubThenOff="${mqtt.noSubThenOff}" | 
|     /> | 
|   | 
| </config> |