- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有使用异步 API 支持从 MSMQ 读取的代码,即使用 BeginReceive()、EndReceive() 和 ReceivedCompleted 事件。基本模式是(取自MessageQueue.ReceiveCompleted Event ...
void StartListening()
{
_msgQ.ReceiveCompleted += ReceiveCompletedEventHandler(FooReceiveCompleted);
_msgQ.BeginReceive();
}
void FooReceiveCompleted(Object source, ReceiveCompletedEventArgs asyncResult)
{
Message msg = _msgQ.EndReceive();
// Do stuff with message.
// Set up listening for next message.
_msgQ.BeginReceive();
}
void StopListening()
{
_msgQ.Close();
}
我能看到的问题是,总是有一个待处理的 BeginReceive() 正在等待新消息,并且通过阅读 .Net 文档,似乎没有官方/推荐的方法来清理它以停止听。
如果我在没有要接收的消息的情况下调用 EndReceive(),那么调用将阻塞,直到有消息可用。或者,除非将 EnableConnectionCache 设置为 false,否则 Close() 似乎不会清除 MSMQ 上的基础句柄(因此也不会清除挂起的监听器),否则句柄将被缓存并且不会在关闭调用时被清除。我可以做到这一点,但理想情况下我想使用缓存。
我能看到的唯一其他选项是启用缓存,然后调用静态方法 MessageQueue.ClearConnectionCache(),这可能是应用程序域范围内的,因此会影响与我试图关闭的队列无关的队列。
附录:其他选项(来自 MessageQueue.Close() )...
Close does not always free the read and write handles to a queue, because they might be shared. You can take any of the following steps to ensure that Close frees the read and write handles to a queue:
Create the MessageQueue with exclusive access. To do so, call the MessageQueue(String, Boolean) or MessageQueue(String, Boolean, Boolean) constructor, and set the sharedModeDenyReceive parameter to true.
Create the MessageQueue with connection caching disabled. To do so, call the MessageQueue(String, Boolean, Boolean) constructor and set the enableConnectionCache parameter to false.
Disable connection caching. To do so, set the EnableConnectionCache property to false.
因此,我对文档中的 API 的第一印象是您无法正确终止队列(使用 BeginReceive/EndReceive 时),除非未使用缓存或您对队列具有独占访问权。
最佳答案
问题的症结在于 MessageQueue.ReceiveCompleted Event 的示例 C#在 MSDN 上使用不带参数的 BeginReceive()。这是一个立即返回给调用者的异步调用,但它会导致一个未完成的异步操作,该操作可能具有很长的生命周期。
当我们尝试在 MessageQueue 上调用 Close() 时,这个未完成的异步操作会阻止 MessageQueue 的正确释放。
一种解决方案是使用 BeginReceive(Timeout);这将导致 ReceiveCompleted 事件即使在没有消息时也会触发,此时我们可以测试一个标志以查看是否正在请求关闭并允许清理正常进行。也就是说,关闭消息队列的外部请求必须等待,例如一个 WaitHandle,ReceiveCompleted 事件将发出信号。因此,该模式在几秒(理想情况下为 1 或 2 秒)的短 BeginReceive() 超时时效果最佳。
关于.net - 如何正确清理 MSMQ 监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10188678/
我刚刚和一位 Microsoft MVP 聊天,他告诉我 MSMQ 已经过时了。这是真的?那么 SOA 的基础设施是什么??? 最佳答案 好吧,他们发布了一个带有 Vista 的新版本 (4.0),它
只是想确认如何将消息发送到远程事务性消息队列。 假设我有两台机器,A 和 B。 机器 A 有一个用于接收消息的事务队列。 Windows 服务监视此队列并对数据执行某些操作(将其保存到 SQL Ser
我一直看到documentation表示不可能发送到事务范围之外的远程事务 msmq 队列。我发现这很难相信,因为我认为我已经这样做了好几个星期了。我有一个小应用程序,它将消息发布到事务性的远程队列。
我正在使用 MSMQ 传输一个 byte 数组。 格式化程序是一个 BinaryMessageFormatter。 目标队列是私有(private)队列,我正在使用直接 TCP 通信。 目标机器在不同
有人可以为我指出一些关于为队列集群设置 MSMQ 的好资源吗?我有兴趣帮助: 实际设置集群MSMQ节点,并使其运行 设置应用程序以将消息发送到集群队列。 设置应用程序(至少 2 个)以从同一个集群队列
我是消息传递的新手,有点不清楚 MSMQ 是否可以为事务队列传递乱序消息。我想这一定是因为如果一条消息没有得到正确处理(并且因为我们将使用多个“竞争消费者”),那么其他消费者可以继续处理消息,同时将失
我们使用 BizTalk Server 通过 MSMQ 发送消息。接收系统要求每条消息都将扩展属性设置为 guid(作为字节数组)。 MSDN 记录了 MSMQMessage here 的 Exten
我正在做 NServiceBus 网站 ( http://docs.particular.net/samples/step-by-step/ ) 上的示例,当我在 Visual Studio 中运行时
我们有一个基于 NServiceBus 的 Pub/Sub 系统,我们有间歇性问题,消息无限期地卡在发布者传出队列上,而不是被传输到订阅者输入队列。 注意事项: 当我们重新启动发布者服务和订阅者服务时
当您向远程队列发送消息时,会在您自己的机器上创建一个临时传出队列。这是否意味着如果您自己的机器上没有安装MSMQ,您就不能使用远程队列? 最佳答案 你是对的。如果你自己的机器上没有安装 MSMQ,你就
我正在尝试使用以下路径连接到远程私有(private) MSMQ 队列: "FormatName:DIRECT=OS:remoteMachineName\Private$\MyQueue" 我收到以下
据我从文档中看到,您应该检查消息队列中是否有消息的方法是使用 Peek 方法。然后,您依靠它失败并返回 MessageQueueException 来告诉您队列为空。 public bool
我正在尝试使用主机文件中的别名指向包含 MSMQ 的服务器。如果我在 MSMQ 路径中指定实际服务器名称,则一切正常: var queue = new MessageQueue("FormatName
是否可以直接从队列中以字符串形式读取消息(与您在计算机管理 MSC 管理单元中查看 MSMQ 消息时看到的消息正文相同),以便我可以自己将其保存到数据库中?我希望能够存储它以便稍后重播而不会丢失任何数
有没有办法清除传出队列。似乎我无法使用 MMC 管理单元完成此操作,当我尝试在代码中清除它时出现错误 Format name is invalid将消息发送到的计算机不存在,因此它们永远不会被发送,但
有一个名为 queue1 的公共(public)队列在机器 A 上。我想从机器 B 向这个队列发送消息。为了实现这一点,我编写了那个 c# 代码。 if (MessageQueue.Exists("m
是否有某种标准配置设置、服务或工具可以接受来自一个队列的消息并将其移至另一个队列?自动处理死消息问题,并提供一些重试能力?我想这就是“MSMQ 消息路由”所做的事情,但似乎找不到有关它的文档(Wind
我正在尝试创建一个 MSMQ 解决方案,对于某些消息,我希望它们仅在下午 6 点之后处理,那么 MSMQ 中是否有一种方法可以在 Future 中处理该消息? 最佳答案 队列是一种先进先出的数据结构。
我们的系统中有许多 MSMQ 队列,包括私有(private)队列和公共(public)队列。有时,从队列中读取的 Windows 服务会崩溃,因此消息会在该队列中堆积。一旦队列达到一定大小(可能是
我们在使用 NServiceBus 的负载平衡的高容量环境中遇到了 MSMQ 问题。 我们的环境如下所示: 1 F5 通过循环分配网络流量到 6 个应用服务器。这 6 个服务器中的每一个都使用一个 B
我是一名优秀的程序员,十分优秀!