2016-07-26 114 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