我正在使用下面的配置连接到主机,它也有 timeout 属性。 现在我的问题是为什么我再次需要将 timeout 参数传递给
QMUX.request(msg, 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>
我的理解是,
和<property name="timeout" value="60000"/>
参数的目的timeout
方法相同。QMUX.request(msg,timeout)
我不这么认为。
前者导致
setSOTimeout
在每个 Socket
连接时被调用。根据 javadoc,设置 SO_Timeout
具有以下效果:
启用/禁用
指定超时,以毫秒为单位。将此选项设置为非零超时后,与此SO_TIMEOUT
关联的InputStream
上的 read() 调用将仅阻塞这段时间。如果超时到期,则会引发Socket
,尽管java.net.SocketTimeoutException
仍然有效。该选项必须在进入阻塞操作之前启用才能生效。Socket
必须 > 0。零的timeout
被解释为无限超时。timeout
换句话说,这是一个传输层超时。我没有研究当
SocketTimeoutException
被提出时会发生什么,但我想该频道将被标记为失败......以某种方式。
后者是针对特定请求的超时。这是一个应用程序协议超时。当它发生时,看起来
request(...)
调用返回 null
。该频道将仍然存在。
如果你传递零作为超时,则没有请求级别超时。
request
调用将无限期地等待响应。
为什么
方法设计成强制传递超时参数?QMUX.request()
这是您需要询问
org.jpos
设计师的问题。
请求方法的超时时间是它等待响应的时间。
通道的超时时间是在没有任何活动的情况下断开连接的时间。
它们是两个不同的东西,这就是为什么你需要在请求方法上指定一个。
如果不想等待响应,可以使用send方法。如果你想永远等待,你可以使用零超时,但不推荐这样做。
还有一件事,多路复用器没有对通道的引用,它通过队列与其通信,因此它不能以任何方式覆盖任何配置。