监视 MSMQ 到达时间



我正在尝试将脚本放在一起来监视服务器上的MSMQ。我找到了这个,它就像一个魅力,但我也需要到达时间。

使用 Get-Member cmdlet 时,我得到了一个属性列表,但似乎没有一个属性能满足我的需求。

有谁知道如何获得到达时间?

/G

终于想通了。

[String]$cName = $Env:COMPUTERNAME
[Reflection.Assembly]::LoadWithPartialName("System.Messaging") | out-null
[System.Messaging.MessageQueue[]]$queues = [System.Messaging.MessageQueue]::GetPrivateQueuesByMachine($cName.ToLower())
Foreach ($queue in $queues) {
    $queue.MessageReadPropertyFilter.SetAll()
    try {
        [System.Messaging.Message]$message = $queue.Peek(10)
        Write-Host $queue.QueueName $message.ArrivedTime
    }
    catch {
        #Write-Host "Timeout"
    }
}

诀窍是设置MessageReadPropertyFilter。可以单独设置每个属性,但现在可以这样做。

$qname = "<YourQueueNameHere>"
[Reflection.Assembly]::LoadWithPartialName("System.Messaging") | out-null
$q = new-object System.Messaging.MessageQueue($qname)
$msgs = $q.GetAllMessages()
foreach ( $msg in $msgs )
{
    Write-Host $msg.ArrivedTime
}

此处Message文档。此处Message.ArrivedTime文档。

这是对我有用的东西。就我而言,脚本会计算过去一小时收到的消息数。

$QueueArray = "MyQueue1.ERRORS", "MyQueue2.ERRORS";
foreach ($queue in $QueueArray)
{
    # Create each MSMQ object
    [System.Reflection.Assembly]::LoadWithPartialName("System.Messaging") | Out-Null
    $MessageQueue = New-Object System.Messaging.MessageQueue (".private$" + $queue)
    
    # Get the amount of the messages in the queue for the past hour.
    $MessageQueue.MessageReadPropertyFilter.SetAll()
    $PastHour = (Get-Date).AddHours(-1)
    $countFailedMessages = 0
    foreach ($message in $MessageQueue )
    {
        if ($PastHour -lt $message.ArrivedTime)
        {
            #Write-Host $message.ArrivedTime
            $countFailedMessages++
            #Write-Host $countFailedMessages
        }
    }
    Write-Host $queue `t $countFailedMessages "failed messages for the past hour"
}

最新更新