How to get the body of a MSMQ Message

Posted by goo on 01-Nov-2015 11:47

OpenEdge 11.5

To add a message to MSMQ I do:

def var msgQ as class System.Messaging.MessageQueue.
def var msg as class System.Messaging.Message.
def var msgActiveXFormatter as class System.Messaging.ActiveXMessageFormatter.
def var msgXMLFormatter as class System.Messaging.XmlMessageFormatter.
def var msgBinaryFormatter as class System.Messaging.BinaryMessageFormatter.

METHOD PUBLIC VOID SendMsg(input ipcLabel as char, input iplcMessage as longchar  ):

msg = new Message().
if MsgFormat = 'Binary' then msg:Formatter = msgBinaryFormatter.
else if MsgFormat = 'ActiveX' then msg:Formatter = msgActiveXFormatter.
else msg:Formatter = msgXMLFormatter.
msg:Label = ipcLabel.
msg:Body = string(iplcMessage).
msgQ:Send(msg).

END Method.

But to receive it, I am not able to get the Body. I do like this:

METHOD PUBLIC VOID ReceiveFromQueue( ):
def var lc as longchar no-undo.

msgQ = new msgMQ().
msgQ:setMsgQueue('.\Private$\test','Testlabel').
msgXMLFormatter = new System.Messaging.XmlMessageFormatter().

msg = new System.Messaging.Message().

msg:Formatter = msgXMLFormatter.

msg = msgQ:Receive().

/*

I am able to see the label and the message I receive is removed from the queue.

I thought I could do

lc = msg:Body(). 

but no luck, I have tried

lc = msg:Body:ToString().

no luck, and many more.... How do I do it? If I use a COM object, I can get the message without any problems.

*/

END METHOD.

Best regards, Geir Otto.

All Replies

Posted by Evan Bleicher on 04-Nov-2015 08:52

Members of the OpenEdge development team may not have experience with this .NET facility.  But hopefully members of the community have used this capability and can provide input.

Posted by Mike Fechner on 04-Nov-2015 09:01

Geir, where are you in Copenhagen?

Anyway, the way to get the message Body is the UNBOX function. The Body of the MSMQ Message is of type System.Object. UNBOX (oMessage:Box) will return you an ABL String, when the message actually contains an string.

Posted by Frank Meulblok on 09-Nov-2015 09:30

Mystery solved:

On receive, you must set the message formatter for the message after the Receive() method returns.

working sample now available here:

knowledgebase.progress.com/.../How-to-use-Microsoft-MSMQ-from-within-ABL

Posted by goo on 17-Nov-2015 16:15

Thanks Frank, I got it from Techsupport. All the examples I found with C# had it in front of the Receive() method, so I never tested it after. Now I know :-)

This thread is closed