写入远程MSMQ

Dan*_*ard 24 .net windows msmq

好的,这是一个非常简单和基本的问题.如果我在Windows机器A上有一个想要写入Windows机器B队列的应用程序,我是否需要在机器A上安装MSMQ(即使那里没有队列)?我刚刚开始为我的应用程序使用队列,并试图找出一些基本原理.

谢谢

stu*_*rtd 41

是的,您需要在本地安装MSMQ才能写入远程队列.如果您要写入专用队列,请查看此页面,其中包含有关如何格式化队列名称的有用信息.如果您正在写入远程Transactional队列,那么您需要确保正确指定(第5点)

这是文章文字:

1.使用远程队列时,格式machinename\private$\queuename中的队列名称不起作用.这会导致"无效的队列路径"错误.

2.必须提到队列名称FormatName:Direct=OS:machinename\\private$\\queuename.

这是必要的,因为队列访问仅在内部使用格式名称语法完成.另一个友好表示将转换为FormatName然后使用.使用远程队列时,除非有AD来解析队列名称,否则友好名称将不起作用.查看文档了解详细信息.

对于Eg.

MessageQueue rmQ = new MessageQueue 
              ("FormatName:Direct=OS:machinename\\private$\\queue");
rmQ.Send("sent to regular queue - Atul");
Run Code Online (Sandbox Code Playgroud)

3.继前一点,请注意FormatName区分大小写.如果你提到早期的字符串 FORMATNAME:Direct=OS:machinename\\private$\\queuename,它将无法正常工作.令人惊讶的是,在这种情况下没有抛出错误."FormatName"字符串的一部分似乎是唯一区分大小写的部分.其他人可能出现在不同的情况.例如.你可以写"DIRECT".

4.如果您想使用机器的IP地址,语法将是FormatName:Direct=TCP:ipaddress\\private$\\queuename.

对于Eg.

MessageQueue rmQ = new MessageQueue
              ("FormatName:Direct=TCP:121.0.0.1\\private$\\queue");
rmQ.Send("sent to regular queue - Atul");
Run Code Online (Sandbox Code Playgroud)

5.您在代码中创建的队列实例的事务属性应与您尝试将消息发送到的队列的事务属性匹配.因此,在前面的示例中,我将消息发送到非事务性队列.要发送到事务性队列,代码将是

MessageQueue rmTxnQ = new MessageQueue
            ("FormatName:Direct=OS:machinename\\private$\\queue");
rmTxnQ.Send("sent to Txn queue - Atul", MessageQueueTransactionType.Single);
Run Code Online (Sandbox Code Playgroud)

如果事务属性不匹配,则不会传递消息.令人惊讶的部分是,我没有得到任何错误,消息刚刚消失

6.最后,当您将消息发送到远程队列时,会在您自己的计算机上创建临时传出队列.这用于远程队列不可用的情况.如果您转到计算机管理控制台(compmgmt.msc),并展开服务和应用程序/消息队列/传出队列,您将看到这些队列.控制台的右侧应显示详细信息,包括状态(已连接或未连接)以及下一跳的IP地址.


Joh*_*ell 8

所有MSMQ通信都需要每端的MSMQ队列管理器.使用MSMQ的应用程序与其本地队列管理器进行通信,后者为其工作.使用MSMQ的应用程序无法直接与本地或远程任何队列通信.