2009-12-16 95 views
3

我有一個關於探路MSMQ ... 我設計了一個異步arhitecture這樣的:MSMQ查詢特定信息

客戶端 - > WCF服務(在WINSERVICE託管) - > MSMQ

所以基本上WCF服務接受請求,處理它們,將它們添加到一個INPUT隊列並返回一個GUID。同一個WCF服務(通過偵聽器)從隊列中獲取第一條消息(做一些事情......),然後將其放回另一個隊列(OUTPUT)。

問題是,如何從客戶端請求時從OUTPUT隊列中檢索結果...因爲MSMQ不允許隨機訪問它的消息,唯一的解決方案是遍歷所有消息並將其推回直到找到我需要的確切一個。我不想爲這個OUTPUT隊列使用DB,因爲客戶端施加了一些限制...

回答

5

您可以通過使用

var mq = new MessageQueue(outputQueueName); 
mq.PeekById(yourId); 

通過ID接收在輸出-隊列爲你的消息看:

mq.ReceiveById(yourId); 
+0

謝謝,這似乎是一個很好的解決方案。我會試一試。 – GeoXYZ 2010-01-04 13:31:58

6

隊列本質上是一種「先進先出」類型的數據結構,而您想要的是一個「隨機訪問」數據結構。它只是沒有爲你想要在這裏實現的目標而設計,所以沒有任何「乾淨」的方式來做到這一點。即使有辦法,這將是一個黑客。

如果您詳細闡述客戶端施加的限制,可能還有其他的選擇。 爲什麼不想使用數據庫?你可以使用本地的SQLite DB,或者甚至是內存的?

編輯:如果你有一個客戶端口述實施細則自己不利則實際上只有三種方法可以去:他們周圍

  1. 工作。在這種情況下,這可能涉及使用SQLite數據庫 - 這只是一個文件,客戶端可能甚至不會將其視爲「數據庫」。
  2. 深入探索並找出潛在的問題,即。 爲什麼他們不想使用數據庫嗎?他們真正的擔憂和潛在假設是什麼?
  3. 接受一個不好的解決方案,並向客戶解釋這是由於他們自己的限制。這從來都不好,也不容易,所以這真的是最後的手段。
+0

因爲客戶不希望我們使用任何數據庫(儘管我試圖解釋原因......)...結果列表務必通過系統故障持久化,並且MSMQ消息可以設置爲可恢復... – GeoXYZ 2009-12-16 07:46:42

+0

我想在MSMQ內部存儲自定義對象(僅用於持久性),但這會引發併發訪問的問題,因爲我有多個線程同時運行,可以訪問此對象......在其上添加一個writerLock會影響整個系統的性能...... – GeoXYZ 2009-12-16 07:48:31

3

你可能可以使用CorrelationId並設置它,當你發送郵件。然後,接收您可以ReceiveByCorrelationId挑選具體消息如下相同的消息:

message = queue.ReceiveByCorrelationId(correlationId); 

此外,CorrelationId是一個具有以下格式的字符串:

Guid()\\Number