Показать сообщение отдельно
Старый 01.02.2021, 17:56   #1  
johny77 is offline
johny77
Участник
 
31 / 27 (1) +++
Регистрация: 04.07.2006
Читать MSMQ из АХ2009
Добрый день всем!
Система AX2009. Есть необходимость читать и писать в Microsoft Messaging Queue (MSMQ). После разворачивание на локальной машине получилось писать (send). Но прочитать не получается, ошибка при вызове метода message.get_Body().
Подскажите, как можно преобразовывать типы использую .net? Может у кого-нибудь есть рабочий пример для чтения? Спасибо большое за помощь.
X++:
static void MSMQ_sendAndRecieveMSMQ(Args _args)
{
    System.Xml.XmlDocument          xmlDocument;
    System.Xml.XmlElement           xmlElement, xmlElementStatus;
    System.Xml.XmlNode              xmlNode;
    
    System.Exception                clrException;
    System.String                   clrString;
    System.IO.StreamWriter          streamWriter;
    System.Messaging.MessageQueue   messageQueue;
    System.Messaging.Message        message;
    System.Messaging.MessageQueueException          exception;
    System.Messaging.MessageQueueTransaction        transaction;
    Microsoft.Dynamics.IntegrationFramework.Adapter.FileSystem          fileSystem;
    Microsoft.Dynamics.IntegrationFramework.Adapter.TransportMessage    transportMessage;
    Str                             strBuf;
    ;
    #define.testString(@'.\private$\test')
    try
    {
        new InteropPermission(InteropKind::ClrInterop).assert();

        if (System.Messaging.MessageQueue::Exists(#testString))
        {
            // SEND
            strBuf  = '<Response stamp="2021-01-22T17:28:09.041Z">'
                    + '<Status id="575064" com="1"/>'
                    + '<Status id="575063" com="0">Текст ошибки </Status>'
                    + '<Status id="575070" com="1"/>'
                    + '</Response>';
            xmlDocument = new System.Xml.XmlDocument();
            xmlDocument.LoadXml(strBuf);

            messageQueue = new System.Messaging.MessageQueue(#testString);

            message = new System.Messaging.Message();
            message.set_Label('AX response');
            message.set_Body(xmlDocument);
            message.set_Formatter(new System.Messaging.XmlMessageFormatter());

            messageQueue.Send(message, 'axapta', System.Messaging.MessageQueueTransactionType::Automatic);
            info(strfmt("Message %1 sent", any2str(CLRInterop::getAnyTypeForObject(message.get_Id()))));

            messageQueue.Dispose();
            message.Dispose();


            // SEND
            messageQueue = new System.Messaging.MessageQueue(#testString);
            // как С# адоптировать под Х++ то что фигурных скобках
            // messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
            message = messageQueue.Receive(new System.TimeSpan(0, 0, 10));
            if (message)
            {
                //message.set_Formatter(new System.Messaging.XmlMessageFormatter());
                // ERROR: Target type array is missing. The target type array must be set in order to deserialize the XML-formatted message.
                xmlDocument = message.get_Body();
                
                // ERROR: Cannot find a formatter capable of reading this message
                // clrString = message.get_Body();

                info( strfmt("Message %1 receive", any2str(CLRInterop::getAnyTypeForObject(message.get_Id()))));
            
            }
            messageQueue.Dispose();
            if (message)
                message.Dispose();
        }
        else
        {
            warning(strfmt("Очередь %1 не найдена", #testString));
        }
    }
    catch(Exception::CLRError)
    {
        clrException = CLRInterop::getLastException();

        if (clrException)
        {
            clrException = clrException.get_InnerException();
            if (clrException)
            {
                error(clrException.get_Message());
            }
        }
    }
    catch(Exception::CLRError)
    {
        //info("An error occurred");
        error(AifUtil::getClrErrorMessage());

    }
    CodeAccessPermission::revertAssert();
}