写给远程MSMQ

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

谢谢

Solutions Collecting From Web of "写给远程MSMQ"

是的,您需要在本地安装MSMQ来写入远程队列。 如果你正在写一个私有队列,看看这个页面 ,它有关于如何格式化队列名称的有用信息。 如果你正在写一个远程事务处理队列,那么你需要确保你指定了正确的(点5)

这是文章文字:

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

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

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

例如。

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

除此之外,请注意FormatName区分大小写。 如果你提到前面的字符串是FORMATNAME:Direct=OS:machinename\\private$\\queuename ,它将不起作用。 令人惊讶的是,在这种情况下不会出现任何错误。 字符串的“FormatName”部分似乎是唯一区分大小写的部分。 其他人可以出现在不同的情况。 例如。 你可以写“直接”。

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

例如。

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

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

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

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

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

所有MSMQ通信都需要在每端都有一个MSMQ队列管理器。 MSMQ使用的应用程序与他们的本地队列管理器进行通信。 使用MSMQ的应用程序无法直接与本地或远程的任何队列通信。

另一种方法(而不是在运行客户端的本地机器上安装MSMQ)将实现一个WCF服务,该服务从MSMQ队列中接收消息。 在这种情况下,您的远程客户端只需指定远程服务端点即可直接写入远程队列。 您还必须小心远程队列上的安全性设置正确。

我认为这将是一个更好的实现基于队列的通信的方式。 这是一个简短的答案,但我会愉快地扩大,如果你有兴趣(我注意到,你很高兴与其他答案:)

以下格式为我们工作

 key="PublicQueueName" value="FormatName:Direct=TCP:192.168.12.58\private$\myqueue" 

你也需要给远程队列访问权限

安全性:允许Anonymus登录

在这里输入图像说明