我们正在使用IBM WebSphere MQ实现简单的pub / sub,其中一个编写器将二进制protobuf消息放入队列,多个读取器浏览它。所有读者都在浏览(没有破坏性的获取),因此消息设置为在10秒后过期。
我们正在使用.NET MQ客户端库遇到问题消息,其中非常小的消息似乎是批量缓冲和接收,而不是在它们被放入队列后立即收到。
我们使用Get()
和MQGMO_FAIL_IF_QUIESCING | MQGMO_WAIT | MQGMO_BROWSE_FIRST/NEXT
致电WaitInterval = MQWI_UNLIMITED
。使用这些标志,Get()
将无限期地阻塞,直到返回下一个可用消息。
当消息大于4KB时,无限制阻塞get的行为与预期一致,并在消息可用时立即返回:
Sender | Reader
------------+------------
| get
put msg #1 |
| <-- msg #1
| get
put msg #2 |
| <-- msg #2
| get
put msg #3 |
| <-- msg #3
但是当消息很小时(在我们的例子中大约是130个字节),那么在两个或三个消息可用之前,get不会返回:
Sender | Reader
------------+------------
| get
put msg #1 |
put msg #2 |
put msg #3 |
| <-- msg #1
| get
| <-- msg #2
| get
| <-- msg #3
消息立即显示在AppWatch中,如果我们从浏览更改为破坏性获取,则立即收到消息。所以我们知道读者和浏览器存在问题。
我们已经确定了三种解决方法,但它们并不是最佳的:
MQWI_UNLIMITED
,请在Get()
=循环中调用WaitInterval
,例如10秒。这意味着将收到个人消息,但最迟会延迟10秒。之前有没有人遇到过这个问题?
答案 0 :(得分:1)
如果发送方和接收方应用程序连接到不同的队列管理器,并且队列管理器通过通道连接,则可以通过修改通道的BATCHLIM属性来修复此问题:
http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.ref.con.doc/q114230_.htm
频道批量传输邮件,直到未提交批次,在该批次中传输的邮件不可用于获取。当消息数量,传输消息的大小或批次打开的时间间隔达到通道上设置的阈值时,将提交批次。