【问题标题】:How to know programmatically whether Message Queueing is enabled on the machine or not?如何以编程方式知道机器上是否启用了消息队列?
【发布时间】:2011-08-29 11:16:13
【问题描述】:

我知道当我尝试创建新的MessageQueue 时,如果未启用消息队列,系统会抛出InvalidOperationException

但是如何以编程方式知道机器上是否启用了消息队列? 我在两个不同的代码库中使用 C# 2.0 和 C# 4.0。

【问题讨论】:

  • 你确实回答了你的问题,试试这个 try { //create or open a MessageQueue } catch (InvalidOperationException ) { // is not enabled }
  • 除非绝对必要,否则使用异常来检测状态/信息是一种不好的做法。

标签: c# .net msmq


【解决方案1】:

您可以为此使用 System.ServiceProcess,但首先您需要添加对您项目的引用 Service.ServiceProcess,然后您可以检索所有服务并获取它们的状态,如下所示:

List<ServiceController> services = ServiceController.GetServices().ToList();
ServiceController msQue = services.Find(o => o.ServiceName == "MSMQ");
if (msQue != null) {
    if (msQue.Status == ServiceControllerStatus.Running) { 
        // It is running.
    }
} else { // Not installed? }

【讨论】:

  • 太棒了!接受作为答案。修改了安装 MSMQ 时 OS 运行的 MSMQ 服务的确切名称。 ServiceName 至少在 Windows 7 和 Windows XP 上是 MSMQ
【解决方案2】:

回答有点晚,但如果您是脚本爱好者,Powershell 可以为您提供帮助。 要获取数字的状态更新,请使用以下脚本:

$queues = Get-WmiObject Win32_PerfFormattedData_msmq_MSMQQueue
$queues | ft -property Name,MessagesInQueue

这将显示队列的名称和每个队列中的项目数。希望有一天这会对某人有所帮助。 :D

【讨论】:

  • 感谢您的回答.. 但是如果您看到标签,问题显然是 C# .. :)
  • 糟糕!没注意,但是现在Powershell在.net框架中紧密结合,可以在本地调用。 #Justsaying
【解决方案3】:
【解决方案4】:

你已经回答了你自己的问题:尝试创建一个新的 MessageQueue,并捕获 InvalidOperationException。

如果没有出现异常,则启用 MQ;如果你得到一个例外,它没有启用。 (如果创建了一个 MessageQueue 实例,您可以丢弃该实例,因为您仅将其用于检测支持)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 2012-10-03
    • 2015-10-11
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多