You are on page 1of 11

ASIGNATURA: Aplicaciones Distribuidas Nivel: 7

INTEGRANTES: Llumiquinga Espinoza Fabricio José


Chugcho Lincango Bryan Sebastian
TEMA: Ejecutores y bases de datos Proyecto Nº: 1

1. INTRODUCCIÓN: Mejora iterativa de programas concurrentes

2. OBJETIVO GENERAL: Modifique SimUTE, con base en lo desarrollado en la


Práctica 1, para utilizar ejecutores y bases de datos

2.1. OBJETIVOS ESPECÍFICOS Nivel*


Poner en práctica todos los conceptos de concurrencia y paralelismo A
Dominar el uso de archivos y bases de datos en Java A
*Alto(A), Medio (M), Bajo (B)

3. DEFINICIONES:
SimUTE: Plataforma de simulación de un robot el cual es usado para fines
educativos
Ejecutores: Manejo de varios hilos mediante instrucciones
Bases de datos: conjunto de datos en el cual nos permite guardar las imágenes
en este caso para su correcta manipulación

4. BASE CONCEPTUAL:

1. SimUTE

SimUTE es un simulador de robot 3d en Java para fines educativos. Se dedica


principalmente a investigadores / programadores que desean una base simple
para estudiar Inteligencia Artificial Situada, Aprendizaje Automático y, en
general, algoritmos de IA, en el contexto de Robótica Autónoma y Agentes
Autónomos. No tiene la intención de proporcionar una simulación del mundo
real y se mantiene voluntariamente legible y simple.

Ejecutores

Una Thread Pool es básicamente un contenedor dentro del cual se crean y


ejecutan hilos. Esto nos permite por ejemplo especificar el número máximo de
hilos que se pueden ejecutar en un momento dado, lo cual es muy útil si nos
interesa obtener resultados de un hilo rápidamente y no que todos coexistan a
la vez.
Otra de los beneficios que obtenemos es que el consumo de memoria será
mucho menor ya que al sólo permitir la ejecución de un número limitado de
hilos, los demás no bloquearán recursos.
Java proporciona dos clases para trabajar con Thread Pools. La primera de
ellas es Executors, una clase abstracta con métodos estáticos para crear
contenedores de capacidad limitada, contenedores con cache, etc.
La segunda clase es ExecutorService, una interface que hereda de Executor y
que nos permitirá trabajar de una manera más fácil y eficaz.

1
Bases de datos

Se define una base de datos como una serie de datos organizados y


relacionados entre sí, los cuales son recolectados y explotados por los sistemas
de información de una empresa o negocio en particular.

5. ACTIVIDADES PREVIAS:
Describa detalladamente:
a. ¿Qué son los ejecutores y de qué tipos existen?

Una Thread Pool es básicamente un contenedor dentro del cual se crean y


ejecutan hilos. Esto nos permite por ejemplo especificar el número máximo de
hilos que se pueden ejecutar en un momento dado, lo cual es muy útil si nos
interesa obtener resultados de un hilo rápidamente y no que todos coexistan a
la vez.
Otra de los beneficios que obtenemos es que el consumo de memoria será
mucho menor ya que al sólo permitir la ejecución de un número limitado de
hilos, los demás no bloquearán recursos.
Java proporciona dos clases para trabajar con Thread Pools. La primera de
ellas es Executors, una clase abstracta con métodos estáticos para crear
contenedores de capacidad limitada, contenedores con cache, etc.
La segunda clase es ExecutorService, una interface que hereda de Executor y
que nos permitirá trabajar de una manera más fácil y eficaz.

b. ¿Qué es jdbc y cómo se utiliza?

JDBC es usado para enviar comandos SQL hacia una base de datos
relacional, que puede ser Oracle, Infomix, SyBase, etc.
Establece una conexión con una BD
Envía sentencias SQL
Procesa los resultados
Connection con = DriverManager.getConnection ( "jdbc:odbc:wombat",
"login", "password");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (rs.next()) { int x = rs.getInt("a"); String s = rs.getString("b"); float f
= rs.getFloat("c"); }

Elabore un plan que detalle las modificaciones que efectuará en el programa


original (Práctica 1)

1. Se deberá crear una base de datos para el almacenamiento de las


imágenes en este caso será usado PostgreSQL
2. Se creará una clase imagen donde se definirá los parámetros a
guardar
3. Se creará una clase posgre en la cual se establecerá la conexión entre
java y PostgreSQL
4. En la clase TrainUTE se deberán añadir las librerías de los ejecutores

2
6. MÉTODO/PROCEDIMIENTO

- Las imágenes generadas por TrainUte deberán enviarse como “tareas” a un


Ejecutor, el cual por defecto tendrá un pool de tamaño igual al doble de hilos
de hardware, pero se podrá parametrizar.

Se declaran las librerías:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

private static BlockingQueue<String> queue = new


LinkedBlockingQueue<>(20);
ExecutorService pool = Executors.newFixedThreadPool(5);

- El Ejecutor (o la “tarea”) guardará cada imagen en una base de datos de su


elección, donde deberá por cada imagen indicarse:
o Id (puede ser simplemente un autonumérico)
o Acción que la generó (wasd)
o Timestamp
o (Atención: la imagen deberá guardarse íntegramente en la bdd, NO
como link a un archivo)

Se crea una clase donde direccionamos losa tributos que tendrán las imágenes
package simute.test;

import java.awt.Image;
import java.sql.Timestamp;

public class imagen {


private int id;
private String name;
private Timestamp fecha;
private Image archivo;

public Image getArchivo() {


return archivo;
}

public void setArchivo(Image archivo) {


this.archivo = archivo;
}

public int getId() {


return id;
}

public void setId(int id) {

3
this.id = id;
}

public String getName() {


return name;
}

public void setName(String name) {


this.name = name;
}

@Override
public String toString() {
return this.id+" : "+this.name;
}

Como primer paso para la base de datos debemos crear una instancia que nos
de una conexión para la base de datos

public class posgre {


//DATOS PARA LA CONEXION
private String bd = "ejecutor";
private String user = "postgres";
private String password = "1234";
private String url = "jdbc:postgresql://localhost:5432/"+bd;

private Connection connection = null;


private ResultSet resultSet = null;
private Statement statement = null;

Segundo debemos crear un constructor de clase que se conecta a la base de


datos
public posgre()
{
try{
Class.forName("org.postgresql.Driver");
connection = DriverManager.getConnection(url, user , password);
System.out.println("Conectado a la base de datos [ " + this.bd + "]");
}catch(Exception e){
System.err.println(e.getMessage());
}
}

Tercero se debe crear instancias para guardar la imagen en la base de datos

public boolean guardarfoto(String name, String ruta, String flecha) {


FileInputStream fis = null;
try {
File file = new File(ruta+name);

4
fis = new FileInputStream(file);
PreparedStatement pstm = connection.prepareStatement("INSERT into
"+
" imagen(tipo, fecha, archivo) " + " VALUES(?,?,?)");
pstm.setString(1,flecha);
pstm.setTimestamp(2,java.sql.Timestamp.from(Instant.now()));
pstm.setBinaryStream(3, fis,(int) file.length());
pstm.execute();
pstm.close();
return true;
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (SQLException e) {
System.out.println(e.getMessage());
} finally {
try {
fis.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
return false;
}

Cuarto debemos crear una instancia que convierte una cadena de bytes en una
imagen jpg

private Image ConvertirImagen(byte[] bytes) throws IOException {


ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
Iterator readers = ImageIO.getImageReadersByFormatName("jpeg");
ImageReader reader = (ImageReader) readers.next();
Object source = bis;
ImageInputStream iis = ImageIO.createImageInputStream(source);
reader.setInput(iis, true);
ImageReadParam param = reader.getDefaultReadParam();
return reader.read(0, param);
}

public DefaultListModel Lista_Imagenes()


{
DefaultListModel dml = new DefaultListModel();
try {
statement = connection.createStatement();
resultSet = statement.executeQuery("SELECT id_imagen,tipo, archivo
FROM imagen " );
while (resultSet.next())
{ //se crea un objeto CITA y se le van agregando los datos
imagen img = new imagen();
img.setId( resultSet.getInt("id_imagen") ) ;
img.setName( resultSet.getString("tipo") ) ;

5
try { //antes de agregar el campo imagen, realiza la conversion de bytes
a JPG
img.setArchivo(ConvertirImagen(resultSet.getBytes("archivo")));
} catch (IOException ex) {
System.err.println(ex.getMessage());
}
//por ultimo añade el objeto imagen:img al DefaultListModel
dml.addElement(img);
}
}
catch (SQLException ex) {
System.err.println(ex.getMessage());
}
return dml;
}

- Su programa permitirá recuperar cualquier imagen guardada en la bdd, por


su id, y pasarla a un archivo

private void BtnGuardarActionPerformed(java.awt.event.ActionEvent evt) {


// TODO add your handling code here:

6
int index = this.Lista_Imagenes.getSelectedIndex();//obtiene index
seleccionado
if( index != -1)
{
//Extrae la clase imagen que corresponde a la posición donde se hizo
un clic
imagen img = (imagen)this.modListaImagen.getElementAt(index);
//redimensiona imagen
double alto = img.getArchivo().getHeight(null) /
Math.ceil(img.getArchivo().getHeight(null)/300f) ;
double ancho =img.getArchivo().getWidth(null) /
Math.ceil(img.getArchivo().getWidth(null)/320f) ;
Icon icon = new ImageIcon(
img.getArchivo().getScaledInstance((int)ancho,(int)alto,
Image.SCALE_AREA_AVERAGING) );
this.FOTO.setText("");
this.FOTO.setIcon( icon );//coloca imagen en el JLabel
JFileChooser gua=new JFileChooser();
gua.setFileFilter(new FileNameExtensionFilter("Image Files", "jpg",
"png", "tif"));
gua.showSaveDialog(null);
Path pth=gua.getSelectedFile().toPath();
JOptionPane.showMessageDialog(null,pth.toString());

try {
ImageIO.write((RenderedImage) img.getArchivo(), "JPEG",new
File(pth.toString()+".JPG"));
} catch (IOException ex) {
Logger.getLogger(Interfaz.class.getName()).log(Level.SEVERE,
null, ex);
}

- Su programa emitirá un pequeño resumen estadístico el cual indique, para


un rango de fechas/horas dado, cuántas imágenes de cada tipo (wasd) se
generaron.

7. EQUIPOS Y MATERIALES:
- Java
- NetBeans
- SimUTE

7
8. CUESTIONARIO DE INVESTIGACIÓN:

- Detalle 3 similitudes y 3 diferencias existentes entre los objetos:

Thread ExecutorService ExecutorCompletionService ForkJoin


SIMILITUDES
Ofrecen una forma sencilla de manejar los thread pools
Manejan el algoritmo de robo de trabajo

DIFERENCIAS
Las tareas ForkJoinPool es Usa el ejecutor provisto Usa un tipo
concurrentes una para la ejecución de la especial de
son implementación tarea base y un grupo de
desarrolladas especializada de LinkedBlockingQueue subprocesos
en el método ExecutorService como una cola de conocido como
run(). que implementa finalización. ForkJoinPool
el algoritmo de
robo de trabajo

- ¿Cómo manipular una base de datos en Java y cómo guardar imágenes en


ella?

Como primer paso debemos crear una instancia que nos dé una conexión para
la base de datos

public class posgre {


//DATOS PARA LA CONEXION
private String bd = "ejecutor";
private String user = "postgres";
private String password = "123456789";
private String url = "jdbc:postgresql://localhost:5432/"+bd;

private Connection connection = null;


private ResultSet resultSet = null;
private Statement statement = null;

Segundo debemos crear un constructor de clase que se conecta a la base de


datos
public posgre()
{
try{
Class.forName("org.postgresql.Driver");
connection = DriverManager.getConnection(url, user , password);
System.out.println("Conectado a la base de datos [ " + this.bd + "]");
}catch(Exception e){
System.err.println(e.getMessage());
}

8
}

Tercero se debe crear instancias para guardar la imagen en la base de datos

public boolean guardarfoto(String name, String ruta, String flecha) {


FileInputStream fis = null;
try {
File file = new File(ruta+name);
fis = new FileInputStream(file);
PreparedStatement pstm = connection.prepareStatement("INSERT into
"+
" imagen(tipo, fecha, archivo) " + " VALUES(?,?,?)");
pstm.setString(1,flecha);
pstm.setTimestamp(2,java.sql.Timestamp.from(Instant.now()));
pstm.setBinaryStream(3, fis,(int) file.length());
pstm.execute();
pstm.close();
return true;
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (SQLException e) {
System.out.println(e.getMessage());
} finally {
try {
fis.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
return false;
}

Cuarto debemos crear una instancia que convierte una cadena de bytes en una
imagen jpg

private Image ConvertirImagen(byte[] bytes) throws IOException {


ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
Iterator readers = ImageIO.getImageReadersByFormatName("jpeg");
ImageReader reader = (ImageReader) readers.next();
Object source = bis;
ImageInputStream iis = ImageIO.createImageInputStream(source);
reader.setInput(iis, true);
ImageReadParam param = reader.getDefaultReadParam();
return reader.read(0, param);
}

public DefaultListModel Lista_Imagenes()


{
DefaultListModel dml = new DefaultListModel();

9
try {
statement = connection.createStatement();
resultSet = statement.executeQuery("SELECT id_imagen,tipo, archivo
FROM imagen " );
while (resultSet.next())
{ //se crea un objeto CITA y se le van agregando los datos
imagen img = new imagen();
img.setId( resultSet.getInt("id_imagen") ) ;
img.setName( resultSet.getString("tipo") ) ;
try { //antes de agregar el campo imagen, realiza la conversion de bytes
a JPG
img.setArchivo(ConvertirImagen(resultSet.getBytes("archivo")));
} catch (IOException ex) {
System.err.println(ex.getMessage());
}
//por ultimo añade el objeto imagen:img al DefaultListModel
dml.addElement(img);
}
}
catch (SQLException ex) {
System.err.println(ex.getMessage());
}
return dml;
}

CONCLUCIONES

 Se debe tomar en cuenta que las librerías son indispensables para el


correcto funcionamiento.
 Se debe referenciar correctamente las tablas a las cuales se llama en la
programación.
 El correcto uso de los ejecutores nos ayuda al manejo de varios hilos
evitando un overload

DISCUSIÓN:


El ejecutor ExecuteService nos permite ejecutar las tareas que sean
asignadas
Se debe tener en cuenta que la conexión a la base de datos también se
encuentra manejada con una librería.
9. EVALUACIÓN DEL APRENDIZAJE:

Resultados de aprendizaje de Resultados de aprendizaje Nivel del


la carrera de la asignatura aprendizaje
de la práctica
Aplica pensamiento lógico, Implementa sistemas A
fundamentos matemáticos, distribuidos cuyos
principios algorítmicos, técnicas componentes compartan
y lenguajes de programación; correctamente la información,

10
en la fundamentación, diseño y el procesamiento y la lógica
desarrollo de programas de la ejecución.
computacionales.
*Alto(A), Medio (M), Bajo (B)

10. EVALUACIÓN DE RESULTADOS OBTENIDOS:

Resultados obtenidos SI NO Observaciones


Implementa una aplicación distribuida compleja y X
completa en Java

12.- BIBLIOGRAFÍA:

- [PS] Pablo Sznajdleder. (2010). Java a Fondo. Alfaomega, México


- [SH] Schildt (2014). Java The Complete Reference (9th edition). Oracle.
ISBN-13: 978-0071808552
- https://docs.oracle.com/javase/tutorial/jdbc/basics/index.html

13.- RUBRICA DE EVALUACIÓN DEL PROYECTO


- presentación y defensa: 80%
- entrega programa: 10%
- entrega informe: 10%

Elaborado por: Revisado por: Aprobado por:

_____________________ _____________________ _____________________


Diego Ordóñez Víctor Gálvez Oswaldo Moscoso
DOCENTE RESPONSABLE DE COORDINADOR DE
ÁREA CARRERA
Fecha: 04 / 04 / 2019 Fecha: / / 2019 Fecha: / / 2019

11

You might also like