为何QMUX.request()需强制传入timeout参数?与Channel配置timeout是否等效?
关于jPOS中Channel配置timeout与QMUX.request超时参数的区别
我使用以下配置连接主机,其中包含timeout属性。我的疑问是:为何调用
QMUX.request(msg, timeout)时仍需传入timeout参数?我认为<property name="timeout" value="60000"/>与QMUX.request(msg,timeout)的timeout参数作用相同,若理解有误请指正。
<channel-adaptor name="my-channel-adaptor" class="org.jpos.q2.iso.ChannelAdaptor" logger="Q2" realm="my-channel-realm" pool-size="50" thread-pool-size="10"> <channel class="org.jpos.iso.channel.ASCIIChannel" packager="org.jpos.iso.packager.GenericPackager"> <property name="host" value="localhost"/> <property name="port" value="65000"/> <property name="timeout" value="60000"/> <property name="maxPacketLength" value="4096"/> <property name="header" value="600"/> <property name="lengthHeader" value="2"/> <property name="keepAlive" value="true"/> </channel> </channel-adaptor>
解答
Channel配置的timeout:这是底层Socket通信通道的IO级超时,控制的是Socket层面的读写等待时长——比如发送报文后,底层Socket等待对方返回数据的最长时间,或是建立TCP连接时的超时。它是通道的全局默认配置,作用于所有通过该通道发起的IO操作,和QMUX的报文匹配逻辑无关。
QMUX.request的timeout参数:这是业务级的报文匹配超时,控制的是QMUX发送请求报文后,等待找到对应响应报文(通过MTI、报文头或自定义匹配规则关联请求与响应)的最长时间。哪怕底层通道IO没超时,如果QMUX在指定时间内没能匹配到对应响应,依然会抛出超时异常。
两者作用层级完全不同,不存在替代关系:通道timeout保障底层通信不会无限僵死,QMUX的timeout保障业务请求不会无限等待响应。如果调用QMUX.request时不传入timeout参数,部分QMUX实现会使用默认值(比如0表示无限等待),并不会自动复用Channel配置的timeout值。
内容的提问来源于stack exchange,提问作者Sanjok
相关产品推荐
相关产品推荐

