专栏首页c#开发者MSMQ突破4M限制的方法

MSMQ突破4M限制的方法

    在默认情况下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 = ;

            int msgNumber = ;

            int chunkSize = ;

            //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()) != -)

                    {

                        // 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 = ;

                            //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(, , , ));

                    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, , length);

                        //Write the buffer into the file

                        fs.Write(data, , length);

                        //Receive following message

                        msg = queue.Receive(new TimeSpan(, , , ));

                    }

                }

            }

            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();

            }

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

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    MSMQ 消息发送大于 4 导致 System.Messaging.MessageQueueException Mb。 察看本文应用于的产品 社区解决方案免责...

    阿新
  • Modifying namespace in XML document programmatically

    Modifying namespace in XML document programmatically static XElement stripNS(XEl...

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

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

    阿新
  • I'm Telling the Truth(二分图)- HDU 3729

    二分图:设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点...

    ACM算法日常
  • 原 初学数模-MATLAB Quick S

    不高不富不帅的陈政_
  • 3分钟短文 ! Laravel拼装SQL子查询的最佳实现

    对于数据库DBA可能更习惯从SQL的角度出发,从SQL现有的语言结构和功能上解决问题。比如查询一个product表,要求查询条件中,product_catago...

    程序员小助手
  • 一个有用的Chrome扩展应用:SAP UI5 Inspector

    There is a useful Chrome Extension for UI5 which could be downloaded via url:

    Jerry Wang
  • Linux下常见的web运行环境和控制面板汇总

    宝塔 宝塔Linux面板是提升运维效率的服务器管理软件,支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等100多项服务器管理功能。 有2...

    Erwin
  • MySQL主主同步环境出现1236错误

    环境: MySQL 5.7.25 主主架构 故障现象: 发现互相之间的同步均发生异常,两端均出现1236错误,在两个主节点上分别执行show slave st...

    Alfred Zhao
  • CodeForces 732D Exams

    D. Exams time limit per test 1 second memory limit per test 256 megabytes ...

    ShenduCC

扫码关注云+社区

领取腾讯云代金券