Cliente – Suministrador

Vamos a crear un suministrador que facilita datos y un cliente que los consume (o un productor y un consumidor).

Problema Productor – Consumidor

Diagrama del proceso cliente-suministrador:

Bloquear un fichero con Java

FileChannel

File file = new File("test.txt");

FileChannel channel = new RandomAccessFile(file, "rw").getChannel();

FileLock lock = channel.lock();

// Acceso al fichero



lock.release();

channel.close();

 

Cliente:

import java.io.File;
import java.io.RandomAccessFile;
import java.io.PrintStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileLock;

public class Cliente {

    /**
     * @param args Argumentos de la línea de comando
     *             El primer argumento pasado, será la ruta del fichero
     */
    public static void main(String[] args) {

        String nombreFichero = "";
        File archivo = null;
        RandomAccessFile raf = null;
        FileLock bloqueo = null;
        int cuenta = 1;
        int valor;
/*
        try{
            //Rediregimos salida y error estándar a un fichero
            PrintStream ps = new PrintStream(new BufferedOutputStream(new FileOutputStream(new File("javalog_cliente.txt"),true)), true);
            System.setOut(ps);
            System.setErr(ps);
        } catch(Exception e){
            System.err.println("Cliente. No he podido redirigir salidas.");
        }
*/

        if (args.length > 0)
            nombreFichero = args[0];
            //Hemos recibido la ruta del fichero en la línea de comandos
        else
            nombreFichero = "/home/usuario/buffer.txt";
        //Fichero que se utilizará por defecto

        //Preparamos el acceso al fichero
        archivo = new File(nombreFichero);
        while (cuenta <= 10) {//leeremos 10 datos
            try {
                raf = new RandomAccessFile(archivo, "rwd"); //Abrimos el fichero
                //***************
                //Sección crítica
 
 
 
 
 
 
 
 
 
 
 
                //Fin sección crítica
                //*******************
                Thread.sleep(2000);//simulamos tiempo de procesamiento del dato
            } catch (Exception e) {
                System.err.println("Cliente. Error al acceder al fichero.");
                System.err.println(e.toString());
            } finally {
                try {
                    if (bloqueo != null) bloqueo.release();
                    if (raf != null) raf.close();
                } catch (Exception e2) {
                    System.err.println("Cliente. Error al cerrar el fichero.");
                    System.err.println(e2.toString());
                    System.exit(1);  //Si hay error, finalizamos
                }
            }
        }
    }
}

 

Suministrador:

import java.io.File;
import java.io.RandomAccessFile;
import java.io.PrintStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileLock;

public class Suministrador {

    /**
     * @param args Argumentos de la línea de comando
     *             El primer argumento pasado, será la ruta del fichero
     */
    public static void main(String[] args) {

        String nombreFichero = "";
        File archivo = null;
        RandomAccessFile raf = null;
        FileLock bloqueo = null;
        int i = 1;

      /*
        try{
            //Rediregimos salida y error estándar a un fichero
            PrintStream ps = new PrintStream(
                             new BufferedOutputStream(new FileOutputStream(
                             new File("javalog_suministrador.txt"),true)), true);
            System.setOut(ps);
            System.setErr(ps);
        } catch(Exception e){
            System.err.println("Suministrador. No he podido redirigir salidas.");
        }
*/
        if (args.length > 0)
            nombreFichero = args[0];
            //Hemos recibido la ruta del fichero en la línea de comandos
        else
            nombreFichero = "/home/usuario/buffer.txt";
        //Fichero que se utilizará por defecto

        //Preparamos el acceso al fichero
        archivo = new File(nombreFichero);

        while (i <= 10) {//escribiremos 10 datos
            try {
                raf = new RandomAccessFile(archivo, "rwd"); //Abrimos el fichero
                //***************
                //Sección crítica








                //Fin sección crítica
                //*******************
                Thread.sleep(1000); //Simulamos tiempo de creación del dato
            } catch (Exception e) {
                System.err.println("Suministrador. Error al acceder al fichero.");
                System.err.println(e.toString());
            } finally {
                try {
                    if (bloqueo != null) bloqueo.release();
                    if (raf != null) raf.close();
                } catch (Exception e2) {
                    System.err.println("Suministrador. Error al cerrar el fichero.");
                    System.err.println(e2.toString());
                    System.exit(1);  //Si hay error, finalizamos
                }
            }
        }
    }
}

Abrir en una consola el cliente:

javac Cliente.java
java Cliente numeros.txt

y en otra el suministrador:

javac Suministrador.java
java Suministrador numeros.txt

¿Qué ocurre al lanzar varios clientes?

Mejora: Realizar en IntelliJ IDEA el Cliente-Suministrador y proporcionar un menú para lanzar procesos: 1 suministrador y varios clientes.

Tarea online de la unidad 1

 

Deja una respuesta