1

我一直在寻找一种简单的方法来清除给定服务器的 MSMQ 中的所有队列。我不需要创建或删除队列,只需清除任何消息。

4

2 回答 2

4

我很难找到这个答案,所以决定发布我发现的内容。就创建脚本与 fsi 而言,这可能存在一些变化,但这是我的解决方案。

在其中创建一个脚本:

open System
open System.Messaging

let purgeQueue (server :string) =
    let qs = MessageQueue.GetPrivateQueuesByMachine server
    for q in qs do
        printfn "%O" q.QueueName
        q.Purge()

启动 fsi 和 #r System.Messaging.dll。然后加载此脚本并在您想要的服务器上运行 call purgeQueue 。我的案例我通过了 localhost ,因为我在盒子上。

于 2012-06-22T19:43:27.057 回答
4

@Joshua - 我在您的代码中添加了一些额外的位,只是为了它。这会自动引用System.Messaging.dll并允许您切换是清除公共队列和私有队列还是仅清除公共队列。

#if INTERACTIVE
#r "System.Messaging.dll"
#endif

open System
open System.Diagnostics
open System.Messaging

//
[<RequireQualifiedAccess>]
module Queue =
    //
    let purgeByMachine includePrivateQueues (machineName : string) =
        let queues =
            let publicQueues = MessageQueue.GetPublicQueuesByMachine machineName
            if includePrivateQueues then
                let privateQueues = MessageQueue.GetPrivateQueuesByMachine machineName
                Array.append publicQueues privateQueues
            else
                publicQueues

        queues
        |> Array.iter (fun queue ->
            sprintf "Purging queue: %s" queue.QueueName
            |> Trace.WriteLine

            queue.Purge ())
于 2012-06-22T23:04:52.053 回答