好的,我的手上有一个有趣的问题。这里有一些背景知识:
我正在编写一个媒体库服务实现,它将为前端Flash播放器提供URL。客户希望能够通过将带有一些元数据的文件上传到FTP文件夹来将内容推送到服务中 - 我可以控制元数据模式。观看此文件夹的服务将获取所有新文件,将其复制到“内容”文件夹中,然后将元数据和URL推送到内容服务中的内容并进入数据库。
内容服务不是问题,已完成。观看FTP文件夹是。
我当前的实现使用FileSystemWatcher对象和xml文件的过滤器。
每个内容项目可能有多个文件,例如高,中,低质量的视频。
我计划通过流程或工具强制执行内容被组织到自己的文件夹中,只是为了简洁,但这不是真正的问题。
xml文件看起来有点像这样:
<media>
<meta type="video">
<name>The Name Displayed</name>
<heading>The title of the video</heading>
<description>
A lengthy description about the video..
</description>
<length>00:00:19</length>
</meta>
<files>
<video file="somevideo.flv" quality="low"/>
<video file="somevideo.flv" quality="medium"/>
<video file="somevideo.flv" quality="high"/>
</files>
</media>
因此,当创建新文件时,会触发FileSystemWatcher.Created事件。我有一个单独的线程运行来处理与主服务进程共享队列的内容(不要担心它使用生产者消费者模式,详见此处:http://msdn.microsoft.com/en-us/library/yy12yx1f.aspx)。
这一切都很好,但现在我遇到了左边和右边的边缘情况!
我已经考虑到视频上传需要更长的时间,因此处理器会尝试获取独占锁定,如果失败,它会将项目移动到队列的后面并移动到下一个项目。< / p>
有人可以为这种情况推荐最佳做法吗? filesystemwatcher是个好主意还是服务只是定期扫描文件夹?
编辑:只是为了让您了解规模。我们总共谈论了1000件商品中的10件。可能以大块上传。
答案 0 :(得分:3)
FileSystemWatcher是一种获得文件丢弃的早期可见性的实用方法,但是有很多边缘情况可能导致错过事件。你仍然需要定期扫描才能确定。
避免互联网问题;客户端可以上传为foo.xml.upload,然后在那里重命名为foo.xml吗?这样可以避免冗长的锁定文件......(你只需忽略.upload文件)。
另外:注意“这里没有发明”......有许多现有的实用工具可以监控文件夹; BizTalk for(一个矫枉过正)的例子。我不是说“不要自己做”,而是至少考虑预先制作的选项。
答案 1 :(得分:1)
观看文件创建时常见的缺陷是,您可能会在上传完成之前收到您的活动,因此您最终会处理不完整的文件。
当然你可以检查一下,因为不完整文件的xml不能很好地形成。但更好的解决方案IMO是让上传者写入临时文件,完成上传后,将文件重命名为* .xml。
对于FileSystemWatcher本身,嗯......当它在网络共享上使用时,我已经开始不信任它(delete
事件从未被触发过)。所以我编写了自己的“观察者”,它具有与FSW类似的界面,但只是轮询目录以进行文件创建/删除/更改。不像FSW那么优雅,但更可靠。
答案 2 :(得分:0)
您可能希望运行网络服务,因为上传程序可以在上传完成时ping通。只需一个网址即可,例如“http://www.bigtimecompany.com/ftpuploadcomplete.php”,在被调用时会激活任何程序检查ftp文件夹。