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.
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. –
@ RobStevenson-Leggett ¿Encontró una solución de terceros? o acabas de hacer tu propio? – phuzi