MQ系列消息被多次读取

时间:2011-02-16 15:38:44

标签: .net ibm-mq

我遇到一个问题,即偶尔会从Q中读取一条消息。我正在使用.NET包装器为MQSeries(amqmdnet.dll)并使用Win Service读取消息。

Here's how I do it with VB.NET:

'QManager
 Dim properties As Hashtable = New Hashtable(4)

        properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_CLIENT)
        properties.Add(MQC.CHANNEL_PROPERTY, channelName)
        properties.Add(MQC.HOST_NAME_PROPERTY, iPAddress)
        properties.Add(MQC.PORT_PROPERTY, port)

        QManager = New MQQueueManager(queueManagerName, _
                                              properties)


'Q itself
getMessageOptions.Options = _
            MQC.MQGMO_FAIL_IF_QUIESCING Or _
            MQC.MQGMO_WAIT Or _
            MQC.MQGMO_SYNCPOINT

getMessageOptions.WaitInterval = 1000 ' read from config

Dim locker As New Object

System.Threading.Monitor.Enter(locker)

Q.Get(message, getMessageOptions)

QManager.Commit()

System.Threading.Monitor.Exit(locker)

我听说Q.Get(message,getMessageOptions)使消息对其他读者不可用,QManager.Commit反过来只是从Q中删除消息(类似于.NET Peek& Dequeue)。这本身就可以消除对Monitor的需求。

在我的Win Service中,多个线程读取Q并且我们怀疑由于轮询间隔较短(100ms或更短),包装器没有足够的时间更新消息的“Read”标志,因此它被拾取不止一次重叠线程。历史上,相同的消息最多可以读取四次。

在增加轮询间隔之前,我想确定我是否以正确的方式做事。任何人都可以用我的方法建议任何问题吗?

感谢。

1 个答案:

答案 0 :(得分:5)

相关问题