2016-07-26 40 views
0

我正在爲C#中的Windows Mobile做一個簡單的消息傳遞系統。該應用程序包括使用Web服務通信發送和接收簡單的文本消息。消息隊列應該是持久的,避免與Web服務的連接失敗或應用程序崩潰時丟失數據。單個進程在C#中的簡單持久消息隊列

我知道MSMQ,RabbitMQ,DotNetMQ,但他們應該安裝在設備中,這是非常簡單的設備,我不想在每個手機中安裝任何其他工具,只是爲了完成這個簡單的任務。

我已經實現了將帶有消息的XML序列化隊列寫入文件的功能,並且我始終從該文件讀取和寫入所有時間。

我希望有更好的主意來解決這個問題。 謝謝

+0

Windows Mobile已經過時多年了。你的意思是Windows Phone或Windows 10 Mobile?如果是這樣,爲什麼不使用推送通知? – EJoshuaS

+0

Windows Mobile 6.5!是的,他們已經老了!它們被用於很少的任務,比如這個消息應用程序。 –

回答

0

當然,有一個更好的主意是使用SQLite。 我希望這會幫助你。

0

我真的不知道Windows Mobile有什麼可用,但您可以嘗試使用基本隊列(正常或併發,取決於您的應用程序)伴隨着兩個文件。將入隊的所有內容寫入一個「Enqueue log」文件,並將出列的所有內容寫入另一個「Dequeue log」文件。 這兩個文件總是可以爲您提供足夠的信息來恢復您的隊列,並且您不需要完全重寫/完全序列化您的隊列。它需要手工實施。

關於出院: 例如,可以說我有一個3個消息的隊列:「一」,「二」,「三」。現在我想發送下一個(也是第一個)消息「one」。我將「從隊列中開始刪除」行添加到我的「出隊日誌」中,然後從隊列對象中取出「一個」並將其發送到我想要發送到的位置。當它被髮送時,我追加「 - 從隊列中完成刪除」到我的「出隊日誌」。現在我的日誌文件中有一行「開始從隊列中刪除 - 從隊列中完成刪除」。

我什麼時候崩潰都沒有關係,我總是能夠恢復隊列對象的狀態(至少現在我看不到在這個過程中有任何邏輯錯誤)。所以這不是棘手,但仍然...一些代碼應該被編碼。這將是幾頁代碼。

+0

另外,這兩個文件應該不時地以一些「崩潰持久性」的方式進行清理。例如,當「出隊日誌」變得超過1000條消息時,創建新的「出列日誌2」,然後刪除舊的。對於需要刪除的消息,「Enqueue log」與刪除前相同。 –

+0

謝謝你的答案,其實我正在做一些類似於你的想法的東西。由於我的消息是通過SOAP Web服務作爲XML檢索的,因此我只是將消息附加到文件中,這樣enqueue和getTheFirstElement很容易,棘手的部分是出列。 –

+0

@MariaSilvia編輯我的答案,以防萬一我的出列過程的想法。據我記得我是這麼做的(我必須爲後端系統實現自定義持久化.Net MQ)。 –

0

MSMQ不需要安裝在Windows Mobile 6.5設備上本機支持。順便說一句:在工業領域仍然有很多供應商提供基於WM65的設備,所以這還沒有過時。

基於Windows Mobile(CE)的MSMQ持久且易於使用。它通常用於設備上的進程間通信或用於客戶端服務器通信(這需要在'服務器'上安裝MSMQ)。

因此,主線程創建一個MSMQ,您的進程中的一個線程填充MSMQ,另一個線程可以'偷看',並在成功傳輸後從同一個MSMQ'出列'消息。一個簡單的例子見here

+0

我試圖在設備上創建消息隊列而不安裝它,它給了我一個例外:「消息隊列尚未安裝在這臺計算機上。」 –

+0

也許你試過錯誤的msmq實現?請參閱https://github.com/hjgode/rdmInject/blob/master/RDM_msg_queue/msgqueue.cs中的示例代碼。這是處理由rdm_inject dll代碼發佈的消息的代碼。順便說一句:在WM啓動時已經運行了許多MSMQ實現,讓您可以觀看PowerNotifications或PlugNPlay設備更改等。我在github上託管的項目中使用了其中的各種方法(即https://github.com/hjgode/logging_ce/blob /master/PowerMsgLog/PowerMsgQueue.cpp以及這個logging_ce文件夾中的thers) – josef