【问题标题】:FileSystemWatcher vs. MSMQ. What to choose?FileSystemWatcher 与 MSMQ。选择什么?
【发布时间】:2012-03-15 09:00:04
【问题描述】:

我的服务器很快就会开始接收文件。这些文件将被放置在一个文件夹中。我必须一次读取文件并将数据保存到我的数据库中。我可以只使用 FileSystemWatcher 来监视文件夹,然后在观察者找到新文件时处理文件吗?或者我是否也应该使用 MSMQ,以便在观察者找到新文件后将文件放入队列中?使用 MSMQ 是不是有点矫枉过正? MSMQ 是一件好事,但只要观察者一次只处理一个文件,那么我不太确定是否真的有必要使用 MSMQ。 FileSystemWatcher 是否足以确保一次只处理一个文件?如果文件处理失败,该文件仍将在文件夹中,因此不会丢失。 所以基本上我必须在这两种模型之间进行选择:

传入文件 -> 文件放入文件夹 -> Watcher 看到文件 -> watcher 后面的代码读取文件并将其保存到 db -> Watcher 返回文件夹等待新文件。

传入文件 -> 文件放置在文件夹中 -> Watcher 看到文件 -> Watcher 将消息(包含文件的路径)放入队列并返回查看文件夹 -> QueueWatcher 看到消息,读取从路径中获取文件并将数据保存在数据库中 -> QueueWatcher 重新运行以侦听队列中的新消息。

【问题讨论】:

  • 除非您需要处理断开连接的系统,否则我会保持简单
  • Msmq is a nice thing to have 在这种情况下,您真正​​需要的是什么?
  • 这是我的问题 :) 我开始认为我需要 msmq,因为我被告知我们的服务器需要处理大量传入文件。现在我知道这些文件将通过放置在我们服务器上的文件夹中发送给我们。然后我转向 filesystemwatcher 但在做出最终决定之前,我只是想确保它是一个足够的解决方案:)

标签: c# .net msmq filesystemwatcher


【解决方案1】:

要记住的一件事是您的系统是否会在短时间内接收大量文件。如MSDN documentation中所述:

"如果短时间内有很多变化,缓冲区可能会溢出。 这会导致组件失去对目录更改的跟踪, 它只会提供一揽子通知。扩大规模 具有 InternalBufferSize 属性的缓冲区很昂贵,因为它 来自无法换出到磁盘的非分页内存,因此 保持缓冲区小但足够大,以免错过任何文件更改 事件。”

因此,如果是这种情况,您可能希望使用不同的方法,例如使用服务进行轮询并保留已处理文件的记录。

【讨论】:

  • 这是一个已解决的问题。只要确保您不在事件处理程序中做任何实际工作。只需将 eventargs 放入队列并让工作线程完成工作。
【解决方案2】:

仅尝试FileSystemWatcher。如果这还不够,那么您可以扩展您的解决方案。奥卡姆剃刀仍然存在。

【讨论】:

    【解决方案3】:

    我有一个类似的问题要解决。使用 FileSystemWatcher 后,我对其进行了更改,以便系统的文件写入部分通过 TCP 套接字发送的显式消息通知另一方新文件已准备好。

    我不知道您是否可以更改传输的这一侧,因此它可能无法解决您的问题。

    【讨论】:

      【解决方案4】:

      根据我的经验,MSMQ 比使用 FileSystemWatcher 的 C# 编写的 Windows 服务更复杂、难以开发和维护技术。

      但我更喜欢另一种方式:通过触摸通知新文件已到达的 Web 服务来通知文件服务器。

      【讨论】:

        猜你喜欢
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        • 2012-07-05
        • 2011-08-21
        • 2012-06-10
        • 1970-01-01
        • 2012-08-14
        • 2012-03-02
        相关资源
        最近更新 更多