在默认情况下msmq 3.0(windows xp ,windows 2003)最大单个消息(Message size)大小4M;(包括正文和全部指定属性的消息的大小不能超过 4 MB。 来自windows 2003帮助文件的说明。)
    4M的限制对于一些普通的应用来说已经足够,而且作为消息传递,报文交换,我们推荐的是不要使用超过1M大小的报文。这样可以很好的利用网络带宽,和提高系统的处理性能。但对于一些特别少数的应用仍然存在大报文的需求,而msmq作为一个消息中间件有很多优势。所以我们还是要想办法使用他,或是扩展他的功能。下面就我在网上和通过一些网友的帮助整理了一些突破这个4M限制方法。1.通过修改注册表(regedit)HKLM\SOFTWARE\Microsoft\MSMQ\Parameters\ 加添一个MaxMessageSize DWORD值大小默认4M(0x00400000)最大16M(x00F00000),通过试验发现最大只能是16M左右,如果在改大,再调用程序的是否会报错
Code
using (System.Messaging.MessageQueue mq = new System.Messaging.MessageQueue(".\\private$\\mq3"))
            {
                System.Messaging.Message msg = new System.Messaging.Message();
                msg.BodyStream = new FileStream("e:\\CodeSmithProfessional-40.msi", FileMode.Open);
                mq.Send(msg);
            }

2.消息分段发送,通过Message.ID,Message.CorrelationId关联,分割多个固定大小的消息.

private  void SendFile(string fileName, string queuePath)
        {
            int i;
            int count = 0;
            int msgNumber = 0;
            int chunkSize = 4194000;
            //Open an existing queue
            MessageQueue queue = new MessageQueue(queuePath);
            System.Messaging.Message msg = new System.Messaging.Message();
            MessageQueueTransaction t = new MessageQueueTransaction();
            t.Begin();
            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,t);
                            string nextMsgId = msg.Id;
                            count = 0;
                            //Create a new message
                            msg = new System.Messaging.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,  t);
                    t.Commit();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            finally
            {
                //release queue resources
                queue.Close();
            }
        }

private 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
                    System.Messaging.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();
            }
        }

3.使用BizTalk MSMQ Adapter,支持消息分段(segmentationSupport=true),前提队列必须是事务性(transactional=true),MaxMessageSize最大可以4G,试验证实一个通过passthru方式处理一个200M的文件,处理占用大量cpu和IO外,BizTalk MessageBox数据也更大400M(200M日志文件,200M数据文件)。注意:通过方法2实现的分段,在用BizTalk接收会存在问题,BizTalk不会帮组合成一个大文件处理。

4.使用BizTalk提供的一个LargeMessage api可以以编成方式实现对大报文的处理,处理方式和方法3类似。并且可以实现和BizTalk兼容。

Code
string queueFormatName = "";// args[0];
            string fileName = "";// args[1];
            queueFormatName = @"DIRECT=OS:ibm-t60\private$\myq";
            fileName = "e:\\OpenbravoERP-2.35-windows-installer.exe";
            LargeMessage message = 
                new LargeMessage(new FileStream(fileName, FileMode.Open, FileAccess.Read));

            
            LargeMessageQueue queue = 
                new LargeMessageQueue(queueFormatName);

            queue.Open();
            try 
            {
                queue.Send(message);
            } 
            finally 
            {
                queue.Close();
            }

转载于:https://www.cnblogs.com/neozhu/archive/2007/12/03/980425.html

MSMQ突破4M限制的方法相关推荐

  1. 2016年末程序员突破自我的绝密方法分享

    新霸哥一直致力于了软件开发行业,从事软件开发快五年了,时间过的很快,学到了很多知识,也思考了很多的问题.从最近和大家的交流中,新霸哥发现了很多的朋友在做了软件开发一段时间后非常迷茫,不知道未来的路该如 ...

  2. 小程序突破五层限制的方法

    小程序突破五层限制 客户列表-->添加一次操作没有问题,如果多次添加会累加界面 如果关闭的方式,返回按钮又会直接返回到上上层. 1.解决方案,添加完,用 wx.navigateBack 方法返回 ...

  3. 32位win系统,突破4G内存限制方法

    我本本是32位win7系统,最大支持内存才3个多G,为了不浪费(或者说想让本本运行更顺畅),实施了如下变相突破4G内存限制的方法(记下,备忘): 1.把多余内存转换成虚拟硬盘. 2.设置虚拟内存为&q ...

  4. 如何利用微信小游戏的分包加载机制突破4M代码包体积限制

    相信大家度过了一个不错的端午假期,在端午前夕,即6月15日晚上,微信小游戏宣布支持分包加载功能,白鹭引擎在端午节后第一天正式支持分包加载机制.在正式向开发者介绍如何使用前,我先为各位解读一下我对微信提 ...

  5. 口腔菌群想要突破?这一方法潜力无限

    这是<肠道产业>第 532 篇文章,原文链接:https://mp.weixin.qq.com/s/JldwdrlOrL1f_xs7fbytfw 编者按: 过去二十年的研究已经产生了许多口 ...

  6. Mac使用Aria2下载百度网盘,突破下载限速的方法教程

    百度网盘目前可以说是在国内网盘环境中一枝独秀,日常使用触及在所难免,尤其是对于喜欢下载资源的朋友来说,但是一些限制让它的使用越来越难,尤其是下载速度,普通用户的下载往往远低于自己的预期,特别是对于 M ...

  7. 微信小游戏如何突破4M限制

    微信小游戏现在非常的火, 官方给微信小游戏包体有一个大小为4M的限制, 导致大家都觉的微信小游戏只能做小游戏, 做不了中大型的网络游戏,今天小编就带你说说微信小游戏这个4M. 1: 为什么微信会给&q ...

  8. 微信小游戏开发能否突破4M限制

    前言 小游戏开发 微信小游戏现在非常的火, 官方给微信小游戏包体有一个大小为4M的限制, 导致大家都觉的微信小游戏只能做小游戏, 做不了中大型的网络游戏,今天小编就带你说说微信小游戏这个4M. 1: ...

  9. oracle以32位运行,Oracle在 32位系统上运行突破sga1.7g的方法

    在32bit或者64bit的平台上跑32bit的Oracle的时候,SGA总是受到限制,导致大内存的机器不能完全发挥作用,最近就专门找了一些关于调整最大SGA区的文档,看了看,感觉收获蛮大的,总结了一 ...

  10. C++57个入门知识点_17 类的访问权限及C语言模拟类的封装(类的私有权限突破方法:编译期进行权限检查,运行期通过指针修改类的私有成员变量;利用函数指针对结构体中成员变量进行修改;CPU大小尾排列)

    接上篇:C++57个入门知识点_16 类的标准写法(类名.成员变量.成员函数及对象命名规则:成员变量一般为私有,成员函数为公有并暴露给外部使用成员变量:防止类过大,声明写在.h,实现写在.cpp,调用 ...

最新文章

  1. Quartz-2D绘图之路径(Paths)详解
  2. iOS 播放gif动态图的方式探讨
  3. vue+Element ui中使用 upload实现Excel文件上传
  4. I - Trade Gym - 100212I 网络流
  5. ASP.NET MVC铵钮Click后下载文件
  6. 知乎究竟走的是什么路线?克隆之路靠谱吗?
  7. 大数据笔记(二十一)——NoSQL数据库之Redis
  8. 诺基亚入门级音乐手机售319元
  9. Java岗招聘标准水涨船高,五年Java程序员表示面试太难了
  10. PLC实训 — PLC的27条基本逻辑指令
  11. 单片机课设中期报告_毕业设计中期报告
  12. 俄罗斯的程序员工资高吗
  13. 金融行业软件测试面试题(含答案)
  14. 无源RFID固定资产管理解决方案
  15. 用Python快速分析和预测股票价格
  16. MySQL学习记录(导入Excel表到数据库,并筛选条件输出)
  17. jmeter性能测试--对MQTT服务做压力测试
  18. Innovus/ICC2在命令行窗口打开GUI界面的命令
  19. 解决锁定图层后不能淡显的问题
  20. 程序员常用英语词汇(001)

热门文章

  1. 刺客信条奥德赛缺少dll文件_《刺客信条 奥德赛》免费归来,单人冒险暗杀游戏,搞一搞喽...
  2. 蓝桥杯2016年第七届C++省赛B组第二题-生日蜡烛
  3. HTML5 — 知识总结篇《IV》【实体字符】
  4. P版openstack-nova-compute中日志报错无法同步resource_provider
  5. 【转载】CentOS7.0下安装Telnet
  6. console.log()中的运算与打印事件
  7. 第一周 7.10-7.16
  8. [译]10-Spring BeanPostProcessor
  9. Sublime Text关闭自动更新
  10. SQLite B/S使用(一)