【问题标题】:Simple persistent message queue in C# for a single processC# 中用于单个进程的简单持久消息队列
【发布时间】:2016-11-30 12:15:18
【问题描述】:

我正在用 C# 为 Windows Mobile 做一个简单的消息系统。该应用程序包括使用 Web 服务通信发送和接收简单的文本消息。消息队列应该是持久的,以避免在与 Web 服务的连接失败或应用程序崩溃时丢失数据。

我知道 MSMQ、RabbitMQ、DotNetMQ,但它们应该安装在设备中,这是非常简单的设备,我不想为了这个简单的任务在每个手机中安装任何其他工具。

我已经实现了将带有消息的 XML 序列化队列写入文件的功能,并且我一直从该文件读取和写入。

如果有任何更好的想法来解决这个问题,我将不胜感激。 谢谢

【问题讨论】:

  • Windows Mobile 已经过时多年。您是指 Windows Phone 还是 Windows 10 移动版?如果是这样,为什么不直接使用推送通知?
  • Windows Mobile 6.5!是的,他们老了!它们仅用于少数任务,例如此消息传递应用程序。

标签: c# .net windows-mobile persistent-storage


【解决方案1】:

我真的不知道 Windows Mobile 有什么可用的,但您可以尝试使用带有两个文件的基本队列(正常或并发,取决于您的应用程序)。将入队的所有内容写入一个“入队日志”文件,并将出队的所有内容写入另一个“出队日志”文件。 这两个文件总是可以为您提供足够的信息来恢复您的队列,并且您不需要完全重写/完全序列化您的队列。但它需要手动实现。

关于出队: 例如,假设我有一个包含 3 条消息的队列:“一”、“二”、“三”。现在我想发送下一条(也是第一条)消息“一个”。我将“一个 - 开始从队列中删除”这一行附加到我的“出队日志”中,然后我从队列对象中取出“一个”并将其发送到我想要发送到的位置。当它被发送时,我将“ - 从队列中完成删除”附加到我的“出队日志”中。现在我的日志文件中有一行“一个 - 开始从队列中删除 - 完成从队列中删除”。

我什么时候崩溃没关系,我总是能够恢复队列对象的状态(至少目前我看不到这个过程中有任何逻辑错误)。所以恕我直言,这并不棘手,但仍然......应该编码一些代码。这将是几页代码。

【讨论】:

  • 另外,这两个文件应该不时以某种“持续崩溃”的方式进行清理。例如,当“Dequeue log”超过 1000 条消息时,创建新的“Dequeue log 2”,然后删除旧的。 “入队日志”也一样,需要先删除消息才能删除。
  • 谢谢你的回答,实际上我正在做一些类似于你的想法的事情。由于 SOAP Web 服务将我的消息作为 XML 检索,我只是将消息附加到一个文件中,这样入队和 getTheFirstElement 很容易,棘手的部分是出队。
  • @MariaSilvia 编辑了我的答案,以防我对出队过程的想法。据我所知,我是这样做的(我必须为后端系统实现自定义持久性 .Net MQ)。
【解决方案2】:

MSMQ 不需要安装在 Windows Mobile 6.5 设备上本机支持。 BTW:工业领域还有很多供应商提供基于 WM65 的设备,所以这还不算过时。

基于 Windows Mobile (CE) 的 MSMQ 持久且易于使用。它通常用于设备上的进程间通信或客户端服务器通信(这需要在“服务器”上安装 MSMQ)。

因此,主线程创建了一个 MSMQ,进程中的一个线程填充 MSMQ,另一个线程可以“窥视”,并在成功传输后,将来自同一 MSMQ 的消息“出队”。一个简单的例子见here

【讨论】:

  • 我试图在设备中创建消息队列而不安装它,它给了我一个例外:“消息队列尚未安装在这台计算机上。”
  • 也许您尝试了错误的 msmq 实现?请参阅github.com/hjgode/rdmInject/blob/master/RDM_msg_queue/… 的示例代码。这是处理 rdm_inject dll 代码发布的 msgs 的代码。顺便说一句:在 WM 启动时已经运行了许多 MSMQ 实现,以让您观看 PowerNotifications 或 PlugNPlay 设备更改等。我在托管在 github 上的项目中使用了各种这些(即 github.com/hjgode/logging_ce/blob/master/PowerMsgLog/… 和此 logging_ce 文件夹中的其他)
【解决方案3】:

当然,有一个更好的主意是使用SQLite。 我希望这会对你有所帮助。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 2011-07-29
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多