2010-02-02 204 views
0

如何從VB.net 2008中編寫的VB.net Windows服務讀取MSMQ消息。 MQ中的消息包含XML數據。我需要使用LinQ to XML讀取該XML,使用XSD進行驗證。從VB.net讀取MSMQ消息Windows服務

我真的很感激,如果你能不能告訴我一個樣品

感謝

回答

4

我會建議使用MsmqIntegrationBinding尋找到WCF。我最近也做了同樣的事情(除了使用netMsmqBinding,因爲我沒有集成一個預先存在的系統),並且它工作得很好。對於示例,您應該查看Microsoft提供的WCF Samples

0

我只是寫了這個確切的東西,但由於我將我的消息綁定到一個具體的類,驗證是自動的。請注意,當你在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」等事情。不知道這是否重要,但這是我多年來的做法/習慣...... :)

無論如何,這個類的一個典型的消息是這樣的:

enter image description here

你可以看到類的名稱,有的在體內的模式定義。我沒有任何關係 - 這一切都爲我完成(與反射):)

所以現在我的消息(真正的類的實例)在隊列中,是時候從另一個程序抓住它(也許是服務?)和重組吧!

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。 :)

我希望這給你幾個想法!