2009-02-26 8 views
9

Ok Tengo un problema un poco interesante en mis manos. Aquí hay un poco de antecedentes:¿Mejores prácticas para ver una carpeta de carga?

Estoy escribiendo una implementación del servicio de biblioteca de medios que servirá las URL a un reproductor de flash frontal. El cliente desea poder insertar contenido en el servicio cargando archivos con algunos metadatos en una carpeta de FTP. Tengo el control del esquema de metadatos. El servicio que mira esta carpeta recogerá los archivos nuevos, los copiará en una carpeta de "contenido" y luego insertará los metadatos y las URL en el contenido del servicio de contenido y en la base de datos.

El servicio de contenido no es un problema, hecho. Ver una carpeta FTP es.

Mi implementación actual usa el objeto FileSystemWatcher con un filtro para archivos xml.

Puede haber más de un archivo para cada elemento de contenido, p. alta, med, videos de baja calidad.

Planeo hacer cumplir, ya sea por proceso o por una herramienta, que el contenido esté organizado en sus propias carpetas solo por brevedad, pero esto no es realmente un problema.

El archivo XML tendrá un aspecto un poco como esto:

<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> 

Así que cuando se crea un nuevo archivo se activa el evento FileSystemWatcher.Created. Tengo un hilo separado ejecutándose para procesar el contenido que comparte una cola con el proceso de servicio principal (no se preocupe, está usando el patrón del consumidor productor como se detalla aquí: http://msdn.microsoft.com/en-us/library/yy12yx1f.aspx).

Todo esto funciona bien, pero ahora me encuentro con casos de borde a la derecha y al centro!

He tenido en cuenta que los videos tardarán más en cargarse, por lo que el procesador intentará obtener un bloqueo exclusivo, si eso falla moverá el elemento al final de la cola y pasará al siguiente elemento.

  • ¿Qué ocurre si el servicio falla o si ya hay archivos allí? entonces escribí un método para poner en cola un archivo existente.
  • ¿Qué pasa si los archivos se cargan mientras está haciendo cola en los archivos existentes? ¿Con suerte manejará esto? ¿Debo volver a examinar periódicamente el directorio para ver si me perdí algo?

¿Alguien puede recomendar una mejor práctica para este escenario? ¿Es una buena idea el filesystemwatcher o debería el servicio escanear periódicamente la carpeta?

Editar: Sólo para darle una idea de la escala. Estamos hablando de 10s de miles de artículos en total. Probablemente subido en trozos grandes.

Respuesta

3

FileSystemWatcher es una forma pragmática de obtener una visibilidad temprana de la caída de un archivo, pero hay muchos casos extremos que pueden causar eventos perdidos. Todavía necesitarías un barrido periódico para estar seguro.

Para evitar el mayor número de problemas de exclusión mutua; ¿Podrían los clientes subir como foo.xml.upload, y luego cambiar el nombre a foo.xml uno allí? Eso evitaría un archivo bloqueado largo ... (simplemente ignora los archivos .upload).

Además, tenga en cuenta que "no se inventó aquí" ... existen muchas utilidades que monitorean las carpetas; BizTalk para (un exceso) ejemplo. No digo "no lo hagas tú mismo", pero al menos considera las opciones pre-enlatadas.

+0

Echaré un vistazo a las soluciones de terceros. Creo que no inventado aquí podría entrar en eso. Ya fui rechazado por sugerir Fluent Nhibernate y se me ordenó usar Linq a Sql. Debes obtener la aprobación para cualquier cosa de terceros: toma una edad. –

+0

@ RobStevenson-Leggett ¿Encontró una solución de terceros? o acabas de hacer tu propio? – phuzi

0

Es posible que desee ejecutar un servicio web para que el cargador pueda hacer ping al finalizar la carga. solo una URL funcionaría bien, como "http://www.bigtimecompany.com/ftpuploadcomplete.php" que, al ser llamado, activa cualquier programa que compruebe la carpeta ftp.

1

Un error común al mirar un archivo creación es que puede recibir su evento antes de que se complete la carga, por lo que termina procesando un archivo que está incompleto.

Por supuesto, puede verificarlo, ya que el xml de un archivo incompleto no estará bien formado. Pero una mejor solución IMO es hacer que la herramienta de subida escriba a un archivo temporal y, una vez completada la carga, cambiarle el nombre a * .xml.

En cuanto al FileSystemWatcher, bueno ... He llegado a desconfiar cuando se usa en un recurso compartido de red (el evento delete nunca se activó). Así que escribí mi propio 'observador' que tiene una interfaz similar a la FSW, pero solo está sondeando el directorio para la creación/eliminación/cambio de archivos. No es tan elegante como el FSW, pero es más confiable.

+0

Estoy repasando el archivo cargado intentando bloquearlo periódicamente. –