我遇到一个问题,即偶尔会从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”标志,因此它被拾取不止一次重叠线程。历史上,相同的消息最多可以读取四次。
在增加轮询间隔之前,我想确定我是否以正确的方式做事。任何人都可以用我的方法建议任何问题吗?
感谢。
答案 0 :(得分:5)