WebSphere MQ MQGMO_BROWSE

时间:2015-10-01 16:05:00

标签: .net ibm-mq

我们正在使用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中,如果我们从浏览更改为破坏性获取,则立即收到消息。所以我们知道读者和浏览器存在问题。

我们已经确定了三种解决方法,但它们并不是最佳的:

  1. 填写消息以确保它们总是大于4KB
  2. 而不是MQWI_UNLIMITED,请在Get() =循环中调用WaitInterval,例如10秒。这意味着将收到个人消息,但最迟会延迟10秒。
  3. 切换到破坏性读取而不是浏览。但这意味着每个读者需要一个专用队列。
  4. 之前有没有人遇到过这个问题?

1 个答案:

答案 0 :(得分:1)

如果发送方和接收方应用程序连接到不同的队列管理器,并且队列管理器通过通道连接,则可以通过修改通道的BATCHLIM属性来修复此问题:

http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.ref.con.doc/q114230_.htm

频道批量传输邮件,直到未提交批次,在该批次中传输的邮件不可用于获取。当消息数量,传输消息的大小或批次打开的时间间隔达到通道上设置的阈值时,将提交批次。