FileSystemWatcher与MSMQ。选择什么?

时间:2012-03-15 09:00:04

标签: c# .net msmq filesystemwatcher

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

传入文件 - >文件放在文件夹中 - > Watcher看到文件 - >守望者背后的代码读取文件并将其保存到db - > Watcher返回文件夹等待新文件。

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

4 个答案:

答案 0 :(得分:1)

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

  

“如果短时间内有很多变化,缓冲区可能会溢出。   这会导致组件无法跟踪目录中的更改,   它只会提供全面通知。增加的大小   具有InternalBufferSize属性的缓冲区是昂贵的,因为它   来自非分页内存,无法交换到磁盘,所以   保持缓冲区小但足够大,不会错过任何文件更改   事件“。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我遇到了类似的问题需要解决。在使用FileSystemWatcher之后,我对其进行了更改,以便系统的文件写入部分通过TCP套接字向另一方通知新文件已准备就绪的显式消息。

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