我有一个MSMQ应用程序设置,其中数据被推送到一个队列中。最初我只有一个进程从中读取并处理它。由于卷已经增加,我开始从它读取多个进程,这基本上是我原始进程的一个新实例。我没有看到任何错误,但性能确实下降了。我的理解是每个进程将从队列中读取并接收尚未处理的新消息并继续进行。这是正确的还是多个进程可能最终处理相同的消息?
Dim q As MessageQueue
If MessageQueue.Exists(".\private$\MsgsIQueue") Then
q = New MessageQueue(".\private$\MsgsIQueue")
Else
'GS - If there is no queue then we're done here
Console.WriteLine("Queue has not been created!")
Return
End If
While True
Dim message As Message
counter += 1
Try
If q.Transactional = True Then
Thread.Sleep(2000)
End If
q.MessageReadPropertyFilter.ArrivedTime = True
message = q.Peek(TimeSpan.FromSeconds(20.0))
message.UseJournalQueue = True
message = q.Receive(New TimeSpan(0, 0, 60))
message.Formatter = New XmlMessageFormatter
(New [String]() {"System.String"})
ProcessMessage(message)
....
答案 0 :(得分:2)
好的,你确定队列读数确实导致性能下降吗?我怀疑你的管道中还有其他一些瓶颈,因为MSMQ非常善于处理来自多个进程/线程的读取。
如果我查看您的代码,我会建议您进行以下更改:
如果是tx队列,为什么要睡2秒?如果队列为空,请始终使用tx队列并将对Sleep的调用移至catch块以获得等待间隔。
将过滤器的设置移到循环外部。
删除对Peek的调用,因为它没有执行任何有价值的操作。
使用日记队列仅在发送邮件时使用。所以删除它。
在队列中设置格式化程序,它将用于所有读取。
您还应该在TransactionScope中包含对Read和ProcessMessage的调用,您还可以在另一个try / catch块中包装ProcessMessage。这样,如果ProcessMessage中的一切都变为OK,或者选择中止读取或将消息移动到死信队列,则可以提交读取。