PROGRAMACIÓN II | DPTO. INFORMÁTICA |
Un servidor documental es un ordenador que gestiona una base de datos de documentos, y su cometido principal es recibir peticiones de otros ordenadores para que les envíe una serie de documentos por la red, y se asegure de que lleguen a su destino.
Para enviar los documentos por la red, el servidor divide cada documento en bloques de un tamaño fijo, y envía cada uno de manera individual hacia el ordenador de destino. Cuando un bloque ha llegado, el servidor recibe un mensaje de confirmación.
Los bloques pueden perderse por el camino (por ejemplo, si la red se encuentra saturada en un momento determinado), por lo que unos bloques pueden llegar al destino y otros no. El servidor espera un determinado tiempo a que llegue la confirmación de cada bloque, y cuando ese tiempo se supera, vuelve a enviar el bloque.
Se desea crear un programa, diseñado mediante el método de Jackson, que gestione una parte del proceso de envío de documentos descrito anteriormente. El programa dispone de un fichero, peticion, que almacena la información referente al estado de la petición de una serie de documentos que ha realizado un ordenador al servidor. Cada registro del fichero corresponde a un bloque de un documento que debe ser enviado, y tiene el siguiente formato:
El significado de cada campo es el siguiente:
Además, se dispone de otro fichero, mensajes, donde se almacenan los últimos mensajes de confirmación recibidos del ordenador de destino. Cada registro del fichero corresponde a un mensaje, y tiene el siguiente formato:
El significado de cada registro es confirmar la llegada del bloque correspondiente al documento especificado. El fichero mensajes se encuentra ordenado por documento y para documentos iguales, por bloque.
Nota: Es posible que existan varios registros iguales (igual documento y bloque), esto correspondería a la situación en que un bloque se ha dado por perdido y se ha vuelto a reenviar una o varias veces, pero finalmente ha llegado a su destino al mismo tiempo que una o varias de sus copias.
De igual manera es posible que llegue una o varias confirmaciónes de un bloque ya confirmado. Estas situaciones son válidas, se supone que el ordenador destino puede manejarlas y debemos diseñar nuestro programa de forma que reciban el tratamiento adecuado.
Nuestro programa se va a ejecutar periódicamente (una vez cada segundo), y recibirá como entrada los ficheros peticion y mensajes. A partir de ellos deberá crear dos nuevos ficheros, peticion_act y docs_enviados.
El primero de ellos almacenará registros con el mismo formato y orden que el fichero peticion, y será la actualización del contenido del fichero peticion con la información contenida en mensajes.
El segundo fichero, docs_enviados, almacenará un registro por cada documento completo que se ha conseguido enviar en esa ejecución del programa, y sus registros tendrán el formato:
El tratamiento de los ficheros de entrada será el siguiente:
Se debe suponer que existen programas externos al nuestro que, en el intervalo entre dos llamadas al programa, actualizan adecuadamente los valores del fichero peticion con los datos que hemos escrito en peticion_act, y es posible que se inserten nuevos bloques correspondientes a nuevos documentos que se deben enviar (en este caso los nuevos bloques tendrán el estado EST_PENDIENTE).
Se puede suponer además que los ficheros de entrada se encuentran adecuadamente ordenados y nunca se va a recibir una confirmación de un bloque no enviado.