专栏首页c#开发者MSMQ消息大于4MB限制的解决办法

MSMQ消息大于4MB限制的解决办法

MSMQ 消息发送大于 4 导致 System.Messaging.MessageQueueException Mb。

察看本文应用于的产品

社区解决方案免责声明

作者 Carlos Walzer MVP

注意:这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责。

文章编号 : 555319

最后修改 : 2005年5月24日

修订 : 1.0

概要

本文介绍如何发送大于 4 文件使用 System.Messaging Mb。

症状

当试图发送邮件包含超过 4 Mb 。 的数据是获得以下异常: : 不足资源无法执行操作不足资源无法执行操作 System.Messaging.MessageQueueException System.Messaging.MessageQueueException

原因

MSMQ 消息有 不超过 4 MB 的数据 。 此限制是由于对内存映射文件由消息队列用来存储邮件数据。 这些内存映射文件存储队列所在计算机上 MSMQ\Storage 文件夹中。

解决方案

为了解决这个限制您应该 brake 信息到小数据块 ; 并 多部分邮件 中发送。 多部分消息序列是流的几个邮件中发送数据。 如 MSMQ 协议不支持多部分邮件, 您需要建立自己算法来发送者和接收者之间交换它们。 许多技术能应用于解决此问题。 需要考虑中具有以下任何机制可能生成: 1), 接收者需要知道多部分消息机制 两发送者。 2) 组是 MSMQ 消息包含一个多部分消息需要他人标识。 注意: 注意: 意向是本文是不能涵盖所有可用技术来解决此问题 ; 它们可能异通信业务模型 A 普通示例, 如何发送文件大于 4 Mb 说明在下节。

更多信息

以下示例显示如何发送大于 4 文件 使用 System.Messaging Mb。 注意, 文件是中断到块的 4194000 字节, 因此是二进制数据使用 Message.BodyStream , 邮件正文中保存格式。

using System;
using System.Messaging;
using System.IO;
namespace FilesInMsmq
{
 /// <summary>
 /// This example shows how to send and receive Files larger than 4 Mb. using MSMQ Messages.
 /// How to run the example:
 /// FilesInMsmq [send/receive] [File Name] [Queue Path]
 /// </summary>
 class MsmqFileExample
 {
  //break the mesage into 4 Mb chunks
  static int chunkSize = 4194000;
  [STAThread]
  static void Main(string[] args)
  {
   string fileName;
   string queuePath;
   if (args.Length > 0)
   {
    //get parameters from command prompt
    fileName = args[1];
    queuePath = args[2];
    switch(args[0])
    {
     case "send":
      SendFile(fileName, queuePath);
      break;
     case "receive":
      ReceiveFile(fileName, queuePath);
      break;
    }
   }
  }
  static void SendFile(string fileName, string queuePath)
  {
   int i;
   int count = 0;
   int msgNumber = 0;
   
   //Open an existing queue
   MessageQueue queue = new MessageQueue(queuePath);
   Message msg = new Message();
   try
   {
    //Open the file for reading
    using (FileStream fs = File.OpenRead(fileName))
    {
      // while there are bytes
     while((i = fs.ReadByte()) != -1)
     {
       // if count has reached size, send message
      if(count >= chunkSize)
      {
       msgNumber++;
       msg.AppSpecific = msgNumber;
       //Send the messsage
       queue.Send(msg);
       string nextMsgId = msg.Id;
       count = 0;
       //Create a new message
       msg = new Message();
       msg.CorrelationId = nextMsgId;
      }
      msg.BodyStream.WriteByte((byte)i);
      count++;            // from the original file
     }
     msgNumber++;
     msg.AppSpecific = msgNumber;
     //Send the last message
     queue.Send(msg);
    }
   }
   catch(Exception ex)
   {
    Console.WriteLine(ex);
   }
   finally
   {
    //release queue resources
    queue.Close();
   }
  }
  static void ReceiveFile(string fileName, string queuePath)
  {
   byte[] data;
   int length;
   
   //Open an existing queue
   MessageQueue queue = new MessageQueue(queuePath);
   try
   {
    //Open file for writing
    using (FileStream fs = File.OpenWrite(fileName))
    {
     //Receive the first message
     Message msg = queue.Receive(new TimeSpan(0,0,0,1));
     while (msg != null)
     {
      //Get the Lenght of the message body stream
      length = Convert.ToInt32(msg.BodyStream.Length);
      //Create a buffer to hold the stream in memory
      data = new byte[length];
      //Read the body stream
      msg.BodyStream.Read(data, 0, length);
      //Write the buffer into the file
      fs.Write(data, 0, length);
      //Receive following message
      msg = queue.Receive(new TimeSpan(0,0,0,1));
     }
    }
   }
   catch(Exception ex)
   {
    Console.WriteLine(ex);
   }
   finally
   {
    //release queue resources
    queue.Close();
   }
  }
 }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MSMQ突破4M限制的方法

        在默认情况下msmq 3.0(windows xp ,windows 2003)最大单个消息(Message size)大小4M;(包括正文和全部指定属...

    阿新
  • IOS5开发-控件位置适应屏幕旋转代码

    - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toOrientation  ...

    阿新
  • XmlSerializerFactory Is Pretty Cool[转]

    The XmlSerializerFactory is a new class in .NET 2.0 that provides a factory patt...

    阿新
  • 为安全放弃隐私:大流行紧急情况下的隐私权衡调查(CS Computers and Society)

    COVID-19大流行情况依然严峻的当下,在抗击冠状病毒的情况下收集和交换数据对全球隐私系统构成了重大挑战。这种疾病的规模和严重程度并不少见,但它似乎已经到了一...

    Rosalie
  • CRM One Order search max hit实现原理讨论

    One Order的setting应该不起作用,这里需要的是Fiori Personalize的setting,如果没有,程序会把One Order的Max H...

    Jerry Wang
  • 【算法实战】生成窗口最大值数组

    做算法题了,题的难度我们分为“士,尉,校,将”四个等级。这个算法题的模块是篇幅比较小的那种模块。首先是给出一道题的描述,之后我会用我的想法来做这道题,今天算是算...

    帅地
  • 聊聊storm的JoinBolt

    storm-2.0.0/storm-client/src/jvm/org/apache/storm/bolt/JoinBolt.java

    codecraft
  • java中二分查找(折半查找)的写法

    用户1696846
  • java学习之二分查找法代码

    吾爱乐享
  • 面试官,我会写二分查找法!对,没有 bug 的那种!

    第一篇二分搜索论文是 1946 年发表,然而第一个没有 bug 的二分查找法却是在 1962 年才出现,中间用了 16 年的时间。

    五分钟学算法

扫码关注云+社区

领取腾讯云代金券