Пользовательский конвейерный компонент BizTalk System.OutOfMemoryException - PullRequest
2 голосов
/ 14 февраля 2012

В настоящее время я разрабатываю конвейер настраиваемой отправки BizTalk, который принимает файл XML и преобразует его в Excel. К сожалению, после развертывания конвейера я получаю System.OutOfMemoryException. Я включил код для метода выполнения интерфейса IComponent. Все предложения приветствуются.

public Microsoft.BizTalk.Message.Interop.IBaseMessage Execute(IPipelineContext pContext, Microsoft.BizTalk.Message.Interop.IBaseMessage inmsg)
    {

        MemoryStream outMemStream = new MemoryStream();
        try
        {

            if (inmsg.BodyPart.Data != null)
            {
                // Read the source message coming from the messaging engine and convert it to memory stream 
                byte[] buffer = new byte[16 * 1024];
                using (MemoryStream ms = new MemoryStream())
                {
                    int read;
                    while ((read = inmsg.BodyPart.Data.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        ms.Write(buffer, 0, read);
                    }
                    buffer = ms.ToArray();
                }

                if (buffer != null)
                {
                    var binaryWriter = new BinaryWriter(outMemStream);
                    binaryWriter.Write(buffer);
                }

                OpenXMLOffice oOffice = new OpenXMLOffice();
                outMemStream.Position = 0;
                oOffice.XMLToExcel(outMemStream, TemporaryFileLocation);
                inmsg.BodyPart.Data.Position = 0;
                inmsg.BodyPart.Data = outMemStream;
                pContext.ResourceTracker.AddResource(outMemStream);
            }

            return inmsg;
        }
        catch (Exception ex)
        {
            throw new ApplicationException(String.Format("Error converting XML to Excel:{0} - Stack Trace: {1}", ex.Message, ex.StackTrace));
        }
    }

Вот самая последняя полученная ошибка:

Log Name:      Application
Source:        BizTalk Server
Date:          2/14/2012 9:29:00 AM
Event ID:      5754
Task Category: BizTalk Server
Level:         Error
Keywords:      Classic
User:          N/A
Computer:      IASDev-PC
Description:
A message sent to adapter "FILE" on send port "ExcelSendPort" with URI "C:\SeleneFTPFile\Excel\%MessageID%.xml" is suspended. 
 Error details: There was a failure executing the send pipeline: "IAS.SeleneFTPFile.ExcelEncodePipeline, IAS.SeleneFTPFile, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2add433e7764165f" Source: "Excel File Encoder" Send Port: "ExcelSendPort" URI: "C:\SeleneFTPFile\Excel\%MessageID%.xml" Reason: Error converting XML to Excel:Exception of type 'System.OutOfMemoryException' was thrown. - Stack Trace:    at System.IO.MemoryStream.set_Capacity(Int32 value)
   at System.IO.MemoryStream.EnsureCapacity(Int32 value)
   at System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at IAS.SeleneFTPFile.Components.ExcelPipeline.EncodeExcel.Execute(IPipelineContext pContext, IBaseMessage inmsg)  
 MessageId:  {ED37CDD1-EF0C-46E7-9519-061AF3D4F8A4}
 InstanceID: {B0E448B3-3DAD-4E52-8F87-07C5D5AA5224}

Ответы [ 3 ]

1 голос
/ 15 февраля 2012

обратитесь по этой ссылке ... Это может помочь вам ....

http://blog.pearltechnology.com/biztalk-pipeline-out-of-memory/

1 голос
/ 30 сентября 2012

Даже я сталкиваюсь с той же проблемой.Я могу обнаружить, что причина в том, что позиция потока не продвигается и остается равной 0 для потока inmsg.BodyPart.Data, даже после выполнения инструкции ниже:

read = inmsg.BodyPart.Data.Read(buffer, 0, buffer.Length)
1 голос
/ 15 февраля 2012

Вы можете попробовать предварительно выделить буфер MemoryStream (, как предлагается здесь ). В сообщении об ошибке указывается, что при выполнении буферизованной записи невозможно выделить достаточно памяти для строки (ms.Write(buffer, 0, read);).

using (MemoryStream ms = new MemoryStream(buffer.Length))

Другая проблема, с которой вы столкнулись, заключается в том, что ваш buffer может переполниться, что приводит к именно этой ошибке, когда MemoryStream записывается в (ms.Write(buffer, 0, read)).

byte[] buffer = new byte[2 * 1024 * 1024]; // try increasing to 2MB buffer
...