Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net MSMQ使用问题_.net_Msmq_Message Queue - Fatal编程技术网

.net MSMQ使用问题

.net MSMQ使用问题,.net,msmq,message-queue,.net,Msmq,Message Queue,您能否解释一下,使用可恢复消息时将使用多少RAM内存? 我知道,一条消息大约消耗70–80字节,这没问题,我知道消息正文将保存到磁盘,但它是否也会将正文复制到RAM? 我尝试使用express和recoverable message(消息存储限制为1gb)来测试这一点,在这两种情况下,我都在process explorer中看到,msmq服务进程的工作集(内存)达到了1gb。我明白,在express消息的情况下,这是可以的,但对于可恢复的消息,它应该少很多 第二个问题是关于MSMQ回调限制 如果

您能否解释一下,使用可恢复消息时将使用多少RAM内存? 我知道,一条消息大约消耗70–80字节,这没问题,我知道消息正文将保存到磁盘,但它是否也会将正文复制到RAM? 我尝试使用express和recoverable message(消息存储限制为1gb)来测试这一点,在这两种情况下,我都在process explorer中看到,msmq服务进程的工作集(内存)达到了1gb。我明白,在express消息的情况下,这是可以的,但对于可恢复的消息,它应该少很多

第二个问题是关于MSMQ回调限制

如果收到回调消息,请考虑每个进程都可以 最多只注册63次回调。如果您的回调在队列中等待 无限期无活动,您可能会达到此限制

它是适用于所有队列还是仅适用于一个队列?例如,我有一个进程,我做了如下事情:

QueueFirst = new MessageQueue(@".\test") { Formatter = new BinaryMessageFormatter() };
QueueFirst.ReceiveCompleted += QueueOnReceiveCompleted;
QueueSecond = new MessageQueue(@".\test") { Formatter = new BinaryMessageFormatter() };
QueueSecond.ReceiveCompleted += QueueOnReceiveCompleted;
for (int i = 0; i < 63; i++)
{
    QueueFirst.BeginReceive(TimeSpan.FromSeconds(10), "", Callback);
    QueueSecond.BeginReceive(TimeSpan.FromSeconds(10), "", Callback);
}
QueueFirst=newmessagequeue(@.\test”){Formatter=new BinaryMessageFormatter()};
QueueFirst.ReceiveCompleted+=QueueOnReceiveCompleted;
QueueSecond=new MessageQueue(@.\test){Formatter=new BinaryMessageFormatter()};
QueueSecond.ReceiveCompleted+=QueueOnReceiveCompleted;
对于(int i=0;i<63;i++)
{
QueueFirst.BeginReceive(TimeSpan.FromSeconds(10),“”,回调);
QueueSecond.BeginReceive(TimeSpan.FromSeconds(10),“”,回调);
}

我可以这样做吗?我这样问是因为如果我把周期上限设为63以上,就不会有什么不好的事情发生。我之所以使用它,是因为在“帮助”中有一些关于回调的内容,这是否意味着使用事件处理程序没有任何限制?

MSMQ将消息存储在内存中(如果可以的话),以提高性能
所有类型的消息(快速/可恢复/事务)也会写入磁盘
消息的大小对于确定RAM使用情况并不重要
应该具备了解消息如何使用内存所需的一切
也很有用。

为什么要查看工作集?谢谢你,John,我反复阅读了你的博客文章(尤其是这篇文章),但我仍然有疑问-如果我有很多msmq消息(当然它们处理得很快,但无论如何推得比弹出快),消息会吃掉我所有的内存吗?限制RAM使用和设置较大的磁盘限制是很酷的。还有一个关于线程的问题——它是只涉及队列的63个异步处理程序,还是涉及所有本地队列的63个异步处理程序?因为有关于回调的讨论,可能它只发生在具有AsyncCallback的构造函数中,而不是发生在ReceiveCompleted事件中?MSMQ(Windows 2000之后)将只使用其认为安全的消息体内存。如果您的可用内存不足,则消息将留在磁盘上,以便按需读取。基本上,MSMQ是自我限制的(或者更准确地说,受操作系统的限制)。本文()指出了每个系统63个异步处理程序,而不是每个队列。MSMQ非常聪明,这很好,但当我在本地机器上测试它时,MSMQ消耗了大约5gb的RAM内存(8个),并留下了大约300mb的空闲空间。当我启动的处理程序超过63个时(参见本文中的示例),就不会出现错误。我做错了什么,这让我很困惑:-)公羊是用来吃的。如果您仍然有可用的物理RAM,那么您就不会有问题。关于处理程序,第64次调用应该返回一个资源不足错误。如果不这样做,那么捕获异常的方式可能会有问题。