如何從VB.net 2008中編寫的VB.net Windows服務讀取MSMQ消息。 MQ中的消息包含XML數據。我需要使用LinQ to XML讀取該XML,使用XSD進行驗證。從VB.net讀取MSMQ消息Windows服務
我真的很感激,如果你能不能告訴我一個樣品
感謝
如何從VB.net 2008中編寫的VB.net Windows服務讀取MSMQ消息。 MQ中的消息包含XML數據。我需要使用LinQ to XML讀取該XML,使用XSD進行驗證。從VB.net讀取MSMQ消息Windows服務
我真的很感激,如果你能不能告訴我一個樣品
感謝
我會建議使用MsmqIntegrationBinding尋找到WCF。我最近也做了同樣的事情(除了使用netMsmqBinding,因爲我沒有集成一個預先存在的系統),並且它工作得很好。對於示例,您應該查看Microsoft提供的WCF Samples。
我只是寫了這個確切的東西,但由於我將我的消息綁定到一個具體的類,驗證是自動的。請注意,當你在MSMQ中發送一個對象作爲消息時,它仍然被「縮減」爲XML ......所以從某種意義上說,我想我正在做XSD會做的事情,但以一種更簡單的方式。
'服務'部分在這裏可能是不相關的,但我使用服務作爲MSMQ的發送者,接收者和解析器。
這裏是我在MSMQ牧養的對象:
要了解閱讀,你需要了解如何發送對象(XML,類,等等):
注: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,新XmlMessageFormatter(新型(){的GetType(SyslogEntryLibrary.syslog.SyslogEntry)}) )
我正在告訴MSMQ發送消息的確切格式,所以它可以在消息體中將它分解成XML。噢,還有一件事情,我試圖在發送或接收消息時不要實例化任何對象(更願意重新使用類級變量),純粹是爲了提高資源的考慮。這就是爲什麼你看到像「Me.TheQ」,「Me.MsgTo」等事情。不知道這是否重要,但這是我多年來的做法/習慣...... :)
無論如何,這個類的一個典型的消息是這樣的:
你可以看到類的名稱,有的在體內的模式定義。我沒有任何關係 - 這一切都爲我完成(與反射):)
所以現在我的消息(真正的類的實例)在隊列中,是時候從另一個程序抓住它(也許是服務?)和重組吧!
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。格式化=新XmlMessageFormatter(新型(){的GetType(SyslogEntryLibrary.syslog.SyslogEntry)})
昏暗myMessage作爲消息= Me.rcvQueue.Receive()
SYSEVENT = CTYPE(myMessage。正文,SyslogEntryLibrary.syslog.SyslogEntry)
我見過使用XML作爲主體的例子,甚至只是一個字符串,所以我相信你可以在你認爲合適的時候使用它。
儘管如此,如果我不建議您在業務邏輯中堅持使用POCO,並且讓像MSMQ這樣的低級別工具爲您完成所有XML格式化,但您不會理解您正在嘗試做什麼,就會原諒我。有一件事我討厭用'手動'在代碼中編寫XML。 :)
我希望這給你幾個想法!