11

I want to look inside my queues, the msm console snapin has this property dialog, but it is very difficult to read and the messages which are important to me are encoded and look like this:

3C 3F 78 6D 6C 20 76 65 <?xml ve
72 73 69 6F 6E 3D 22 31 rsion="1
2E 30 22 20 65 6E 63 6F .0" enco
64 69 6E 67 3D 22 75 74 ding="ut
66 2D 38 22 3F 3E 0D 0A f-8"?>..
3C 65 73 62 3A 6D 65 73 <esb:mes
73 61 67 65 73 20 78 6D sages xm
6C 6E 73 3A 65 73 62 3D lns:esb=
22 68 74 74 70 3A 2F 2F "http://
73 65 72 76 69 63 65 62 serviceb
75 73 2E 68 69 62 65 72 us.hiber
6E 61 74 69 6E 67 72 68 natingrh

...

Anyone knows of a tool that would allow me to see my messages in a bit developer friendly way? A tool for easier administering queues would come handy to (like selecting multiple messages and drag and drop them)

Jan
  • 6,532
  • 9
  • 37
  • 48

6 Answers6

5

This is about the best tool I've found: http://www.cogin.com/msmq/QueueExplorer/QueueExplorer2.2.php

Paul Kearney - pk
  • 5,435
  • 26
  • 28
  • Hm, looks nice - but I can only see my Journal sub queue - you think this is because I am not a registered user? – Jan Jun 02 '10 at 22:37
  • I don't have the trial version, but in my full version I can explore all queues, including remote queues. – Paul Kearney - pk Jun 03 '10 at 00:11
  • they have now a new beta which understands sub queues. I am using this so far. A bit buggy (well, beta), but a quite useful tool. I wonder why MS couldn't come up with anything better. – Jan Jul 01 '10 at 04:05
  • Looks awesome at a first glance, way better than Computer Management utility in Windows. +1 – Justin Aug 26 '11 at 13:12
2

I found these two methods while searching for an answer to this question and they actually worked perfectly.

    public System.Xml.XmlDocument ConvertToXMLDoc(System.Messaging.Message msg)
    {
        byte[] buffer = new byte[msg.BodyStream.Length];
        msg.BodyStream.Read(buffer, 0, (int)msg.BodyStream.Length);
        int envelopeStart = FindEnvolopeStart(buffer);
        System.IO.MemoryStream stream = new System.IO.MemoryStream(buffer, envelopeStart, buffer.Length - envelopeStart);
        System.ServiceModel.Channels.BinaryMessageEncodingBindingElement elm = new System.ServiceModel.Channels.BinaryMessageEncodingBindingElement();
        System.ServiceModel.Channels.Message msg1 = elm.CreateMessageEncoderFactory().Encoder.ReadMessage(stream, Int32.MaxValue);
        System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
        doc.Load(msg1.GetReaderAtBodyContents());
        msg.BodyStream.Position = 0;
        return doc;
    }

    private int FindEnvolopeStart(byte[] stream)
    {
        int i = 0;
        byte prevByte = stream[i];
        byte curByte = (byte)0;
        for (i = 0; i < stream.Length; i++)            
        {
            curByte = stream[i];
            if (curByte == (byte)0x02 &&
            prevByte == (byte)0x56)
                break;
            prevByte = curByte;
        }
        return i - 1;
    }

Simply call the ConvertToXmlDoc function, providing the message from the message queue and you'll get an XmlDocument back. I am lazy, so I just drop the innerXml into a file so I can read it.

    MessageQueue queue = new MessageQueue(queueName);
    var msg = queue.Receive();
    var doc = ConvertToXMLDoc(msg);                
    using (var sw = new StreamWriter(@"C:\message.txt")))
           sw.Write(doc.InnerXml);

No application to buy and you get your data back in code so you can mess around with it.

PS: Credit where credit is due. The snippet came from http://social.msdn.microsoft.com/forums/en-US/wcf/thread/c03d80cd-492c-4ece-8890-6a35b12352e0 , which also links to a more detailed discussion of MSMQ's encoding format.

bvoyelr
  • 920
  • 8
  • 11
2

Try this:

string QueueName = @".\private$\publishingQueue"; 

//note, you cannot use method exists on remote queues

if (MessageQueue.Exists(QueueName))
{ 
    var queue = new MessageQueue(queueInfo.QueueName)
    {
        MessageReadPropertyFilter = new MessagePropertyFilter
        {
            ArrivedTime = true,
            Body = true
        }
    };

    var messages = queue.GetAllMessages();
    var m = messages[0];
    m.Formatter = new System.Messaging.XmlMessageFormatter(new String[] {});

    StreamReader sr = new StreamReader(m.BodyStream);

    string ms = "";
    string line;

    while (sr.Peek() >= 0) 
    {
        ms += sr.ReadLine();
    }

    //ms now contains the message      
}
Sam Bunting
  • 845
  • 1
  • 15
  • 36
felbus
  • 2,639
  • 2
  • 24
  • 30
0

You can use Service Bus MQ Manager, its a free open-source tool I wrote for viewing messages in MSMQ, it supports coloring and formatting of XML and JSON messages.

http://blog.halan.se/page/Service-Bus-MQ-Manager.aspx

Daniel Halan
  • 584
  • 7
  • 8
0

If you just have some hexadecimal data that can easily be converted to ASCII and back, then I suggest a text editor that lets you do just that. UltraEdit has a "view hex" function that works to convert both to and from hexadecimal view. You might also try Notepad++ but I don't know if it has that feature.

JYelton
  • 35,664
  • 27
  • 132
  • 191
  • 1
    The property dialog only shows the first n rows and the text decoded besides. I doubt I could do anything with those. – Jan Jun 02 '10 at 22:38
  • Oh right, I didn't realize you didn't have access to more data. – JYelton Jun 02 '10 at 22:49
0

You could also check out MSMQ Studio from https://msmq-studio.com