从VB.net Windows服务中读取MSMQ消息

时间:2010-02-02 02:49:47

标签: vb.net msmq

如何从VB.net 2008中编写的VB.net Windows服务中读取MSMQ消息。 MQ中的消息包含XML数据。我需要使用LinQ to XML读取XML,验证XSD。

如果你能指导我一个样本,我真的很感激

由于

2 个答案:

答案 0 :(得分:4)

我建议使用WCF查看MsmqIntegrationBinding。我最近做了同样的事情(除了使用netMsmqBinding,因为我没有与预先存在的系统集成),并且它已经很好地完成了。对于示例,您应该查看Microsoft提供的WCF Samples

答案 1 :(得分:0)

我刚写了这个确切的东西,但由于我将我的消息绑定到一个具体的类,因此验证是自动的。请注意,当您在MSMQ中发送一个对象作为消息时,它仍然“缩减”为XML ...所以在某种程度上,我想我正在做XSD会做的事情,但是以一种更简单的方式。

'service'部分可能与此无关,但我将服务用作MSMQ的发件人,接收者和解析器。

以下是我如何在MSMQ中使用对象:

要理解阅读,您需要了解如何发送对象(XML,Class,等等):

注意:SyslogEntry是一个POCO,其中包含普通syslog / UDP514消息的每个部分的属性。该课程没有逻辑。

Public Sub SendMessage(syslogEntry As SyslogEntryLibrary.syslog.SyslogEntry, qPath As String)
    Try
        ' Connect to a queue on the local computer. 
        Me.TheQ = New MessageQueue(qPath)
        ' make all messages recoverable
        Me.TheQ.DefaultPropertiesToSend.Recoverable = True
        ' Create a new message. 
        Me.MsgTo = New Message(syslogEntry, New XmlMessageFormatter(New Type() {GetType(SyslogEntryLibrary.syslog.SyslogEntry)}))
        With Me.MsgTo
            .AcknowledgeType = AcknowledgeTypes.PositiveReceive Or AcknowledgeTypes.PositiveArrival
            ' .Body = syslogEntry
            .Priority = MessagePriority.Normal
        End With
        ' set what will be sent with message...
        TheQ.MessageReadPropertyFilter.ArrivedTime = True
        TheQ.MessageReadPropertyFilter.SentTime = True
        TheQ.MessageReadPropertyFilter.CorrelationId = True
        TheQ.MessageReadPropertyFilter.Id = True
        TheQ.Formatter = New XmlMessageFormatter(New Type() {GetType(SyslogEntryLibrary.syslog.SyslogEntry)})
        TheQ.Send(MsgTo)
    Catch ex As Exception
        [...]
    End Try
    Return

以上唯一有趣的部分是:

Me.MsgTo =新消息(syslogEntry,New XmlMessageFormatter(New Type(){GetType(SyslogEntryLibrary.syslog.SyslogEntry)}))

我告诉MSMQ发送消息的确切格式,因此它可以在消息正文中将其分解为XML。哦,另外一件事,我尝试在发送或接收消息时(实际上不再使用类级别变量)实例化任何对象,纯粹是为了速度和速度。资源考虑。这就是为什么你会看到“Me.TheQ”,“Me.MsgTo”之类的东西等等。不知道这是否重要,但这是我多年来的一种习惯/习惯...... :)

无论如何,这个类的典型信息如下:

enter image description here

您可以在Body中看到类名和一些架构定义。我与它无关 - 这一切都为我做了(用反射):)

现在,我的消息(一个类的实例,真的)在队列中,是时候从另一个程序(可能是一个服务?)中获取它,然后重新构建它

它!

Public Function ReceiveMessage(qPath As String) As SyslogEntryLibrary.syslog.SyslogEntry
    Dim sysEvent As SyslogEntryLibrary.syslog.SyslogEntry = Nothing
    Try
        ' Connect to the a queue on the local computer. 
        Me.rcvQueue = New MessageQueue(qPath)
        Me.rcvQueue.MessageReadPropertyFilter.CorrelationId = True
        ' Set the formatter to indicate body contains a SyslogEntry instance
        Me.rcvQueue.Formatter = New XmlMessageFormatter(New Type() {GetType(SyslogEntryLibrary.syslog.SyslogEntry)})
        ' Receive and format the message.  
        Dim myMessage As Message = Me.rcvQueue.Receive()
        sysEvent = CType(myMessage.Body, SyslogEntryLibrary.syslog.SyslogEntry) 
    Catch ex As InvalidOperationException
        [...]
    Catch ex As Exception
        [...]
    End Try
    Return sysEvent
End Function 'ReceiveMessage

就像以前一样,魔术发生在以下几行:

Me.rcvQueue.Formatter = New XmlMessageFormatter(New Type(){GetType(SyslogEntryLibrary.syslog.SyslogEntry)})

Dim myMessage As Message = Me.rcvQueue.Receive()

sysEvent = CType(myMessage.Body,SyslogEntryLibrary.syslog.SyslogEntry)

我见过使用XML作为正文的示例,甚至只是一个字符串,所以我相信你可以按照自己的意愿玩这个。

但是,如果我不建议您尝试做什么,如果我建议您在业务逻辑中坚持使用POCO,那么请原谅我,让MSMQ等低级工具为您执行所有XML格式化。有一件事我讨厌“手动”在代码中编写XML。 :)

我希望这会给你一些想法!