如何从VB.net 2008中编写的VB.net Windows服务中读取MSMQ消息。 MQ中的消息包含XML数据。我需要使用LinQ to XML读取XML,验证XSD。
如果你能指导我一个样本,我真的很感激
由于
答案 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”之类的东西等等。不知道这是否重要,但这是我多年来的一种习惯/习惯...... :)
无论如何,这个类的典型信息如下:
您可以在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。 :)
我希望这会给你一些想法!