System.Messaging.MessageQueueException कारण बड़े से 4 Mb. MSMQ संदेश भेज रहा है

लेखक:

कार्लोस Walzer MVP

समुदाय समाधान सामग्री उद् घोषणा

MICROSOFT CORPORATION और/या उसके संबंधित आपूर्तिकर्ताओं SUITABILITY, विश्वसनीयता, या जानकारी और संबंधित ग्राफ़िक्स यहाँ निहित की सटीकता के बारे में कोई प्रतिनिधित्व करते हैं। ऐसी सभी जानकारी और संबंधित ग्राफ़िक्स "जैसा है" किसी भी प्रकार की वारंटी के बिना प्रदान किए जाते हैं। MICROSOFT और/या उसके संबंधित आपूर्तिकर्ताओं बशर्ते सभी वारंटी और शर्तों संबंध में यह जानकारी और संबंधित ग्राफ़िक्स सहित सभी अव्यक्त वॉरंटी, और शर्तों की बिक्री, उपयुक्तता, किसी विशेष प्रयोजन, WORKMANLIKE प्रयास, शीर्षक और गैर उल्लंघन के लिए, DISCLAIM. यदि आप विशेष रूप से कोई ईवेंट में MICROSOFT और/या इसके प्रदाताओं उत्तरदायी होगा कि सहमत किसी भी प्रत्यक्ष, अप्रत्यक्ष, PUNITIVE, आकस्मिक, विशेष, परिणामस्वरूप होने वाली क्षति या किसी भी नुकसान पहुँचाने से, किसी सीमा, उपयोग, डेटा या PROFITS, की हानि के लिए क्षति के बिना सहित के लिए से बाहर उत्पन्न होने वाले या भी में अलग का उपयोग के साथ कनेक्ट या अक्षमता यहाँ जानकारी और निहित संबंधित ग्राफ़िक्स का उपयोग करने के लिए , चाहे अनुबंध, हानि, उपेक्षा, निश्चित उत्तरदायित्व पर आधारित या MICROSOFT या इसके आपूर्तिकर्ताओं में से कोई भी नहीं है, तो भी अन्यथा, क्षतियों की संभावना की सलाह दी जाती गया है।

सारांश

यह आलेख बताता है कि बड़े से 4 Mb का उपयोग System.Messaging. फ़ाइलों को भेजने के लिए कैसे

लक्षण

कोई संदेश जिसमें से अधिक 4 Mbको भेजने का प्रयास करते हैं। डेटा की निम्न अपवाद प्राप्त होता है:
System.Messaging.MessageQueueException: कार्रवाई करने के लिए अपर्याप्त संसाधन हैं।

कारण

संदेश MSMQ 4 MB से अधिक डेटाहो सकता है। संदेश पंक्तिबद्ध करना संदेश डेटा संग्रहीत करने के लिए उपयोग स्मृति मैप की गई फ़ाइलों के कारण यह प्रतिबंध है। इन स्मृति-मैप की गई फ़ाइलें कहाँ क्यू रहती है MSMQ\Storage फ़ोल्डर में कंप्यूटर पर संग्रहीत होते हैं।

समाधान

इस प्रतिबंध को हल करने के लिए छोटी डेटा खंड में जानकारी brake होना चाहिए; और उन्हें एक बहुखण्डीय संदेशमें भेजें। एक स्ट्रीम में कई संदेश भेजे जाने वाले डेटा की एक बहुखण्डीय संदेश अनुक्रम है। बहुखण्डीय संदेश MSMQ प्रोटोकॉल का समर्थन नहीं करते हैं, आप उन्हें प्रेषक और प्राप्तकर्ता के बीच आदान-प्रदान करने के लिए अपने एल्गोरिथ्म बनाना आवश्यक है। इस समस्या को हल करने के लिए कई तकनीकों लागू किया जा सकता है।  बना सकते हैं कोई भी प्रणाली आवश्यक विचार में निम्न है:
 1) दोनों प्रेषक और प्राप्तकर्ता पता बहुखण्डीय संदेश प्रणाली करने के लिए है।
 2) समूह MSMQ का संदेश एक बहुखण्डीय संदेश वाले दूसरों से पहचाना जा करने के लिए की आवश्यकता है।
 
नोट: इस समस्या पर आरंभ करने के लिए सभी उपलब्ध तकनीकों कवर नहीं करने के लिए इस आलेख के इरादा है; वे संचार व्यापार मॉडल के आधार पर भिन्न हो सकते हैं।
Trivial उदाहरण, बड़े से 4 Mb. एक फ़ाइल को भेजने के लिए कैसे दिखाता है, जो अगले अनुभाग में समझाया गया है।

अधिक जानकारी

System.Messagingका उपयोग करते हुए फ़ाइल एक बड़े से 4 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();   }  } }}
गुण

आलेख ID: 555319 - पिछली समीक्षा: 15/02/2017 - संशोधन: 1

Microsoft .NET Framework 1.1

प्रतिक्रिया