SlideShare una empresa de Scribd logo
Integrando Sistemas reales con
      REST, JMS, Protobuf y MongoDB
      Andrés Perez
        Indra
      David Gómez
        Extrema Sistemas




lunes 26 de marzo de 12
David G ómez
                                              iner
                                     ect & Tra
                            Sw Archit              om
                                     ema-sistemas.c
                          dgomez@extr
                                        zg
                                 @dgome




                                   Andrés Pérez y David Gómez    2
                                      Indra y Extrema Sistemas


lunes 26 de marzo de 12
és Pérez
                          Andr itect             David G ómez
                                                                     iner
                             Sw Arch                        ect & Tra
                                                   Sw Archit              om
                                   z@indra.
                                            es              ema-sistemas.c
                             apere               dgomez@extr
                                                               zg
                                                        @dgome




                                                          Andrés Pérez y David Gómez    2
                                                             Indra y Extrema Sistemas


lunes 26 de marzo de 12
Hablaremos de

      • El caso real.
      • La arquitectura propuesta
            – Interfaz REST entre GUI y Server
            – Protobuf entre Dispositivos y Server/GUI
            – JMS para comunicación asíncrona Server -> GUI
            – MongoDB para persistencia



                                            Andrés Pérez y David Gómez    3
                                               Indra y Extrema Sistemas


lunes 26 de marzo de 12
El caso real.
                          Control de tráfico marítimo




                                                Andrés Pérez y David Gómez    4
                                                   Indra y Extrema Sistemas


lunes 26 de marzo de 12
El caso real.
                          Control de tráfico marítimo




                                                        Emisor AIX
                                                         3-5 min

                                                Andrés Pérez y David Gómez    5
                                                   Indra y Extrema Sistemas


lunes 26 de marzo de 12
El caso real.
                          Control de tráfico marítimo




                                                                      Emisor AIX
                                                                       3-5 min



                                                Andrés Pérez y David Gómez    6
                                                   Indra y Extrema Sistemas


lunes 26 de marzo de 12
El caso real.
                          Control de tráfico marítimo
                                            Receptor GPS
                                             Radar (3 s)
                                             Goniometro

                                                                     Emisor AIX
    Estación Meteo,                                                   3-5 min
       Cámaras,
                    ...
                                               Andrés Pérez y David Gómez    6
                                                  Indra y Extrema Sistemas


lunes 26 de marzo de 12
El Problema:
                          La escalabilidad




                                             Andrés Pérez y David Gómez    7
                                                Indra y Extrema Sistemas


lunes 26 de marzo de 12
El Problema:
                              La escalabilidad
      Por cada barco:
             Recepción y procesamiento de señales (nº)
             Transacciones,
             Cálculo de alarmas
             Gestión de Históricos


                                                 Andrés Pérez y David Gómez    8
                                                    Indra y Extrema Sistemas


lunes 26 de marzo de 12
El Problema:
                                La escalabilidad
      Señales (1 AIS x 3 min + 1 radar x 3 seg) x 100 barcos
      Alarmas
             Persistencia de Líneas de Varada: (10.000+ ptos x 100+ líneas)
             40 Alarmas
      Zonas, Elementos Navegación
      Persistencia: Total: 87 tablas + históricos(x2)



                                                        Andrés Pérez y David Gómez    9
                                                           Indra y Extrema Sistemas


lunes 26 de marzo de 12
El problema:
                          la escablabilidad




                                              Andrés Pérez y David Gómez    10
                                                 Indra y Extrema Sistemas


lunes 26 de marzo de 12
La arquitectura


                                                         Speaker’s Name   11
                                    Speaker mail – company or community


lunes 26 de marzo de 12
REST                                   Cameras
                      GUI 1

                               JMS   Server     Protobuf
                               JMS
                                                                        Radar

                              REST   Spring Data
                      GUI 2

                                       DB                               Gonio


                                                                   Speaker’s Name   12
                                              Speaker mail – company or community


lunes 26 de marzo de 12
REST
                          Comunicación síncrona entre GUI y Servidor




                                                                          Speaker’s Name   13
                                                     Speaker mail – company or community


lunes 26 de marzo de 12
¿Qué es REST?

      • REpresentational State Transfer
      • HTTP como protocolo de comunicación
            – No sólo como transporte
      • La sesión es responsabilidad del cliente
            – Escalable




                                          Andrés Pérez y David Gómez    14
                                             Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿Qué es REST?

      • URIs representan recursos (no acciones)
      • Acciones indicadas en el método HTTP
      • Formato especificado en cabeceras HTTP
            – Accept:
            – ContentType:
      • No todas las respuestas contienen datos
      • Error o Resultado con HTTPStatus

                                             Andrés Pérez y David Gómez    15
                                                Indra y Extrema Sistemas


lunes 26 de marzo de 12
Comparación




                                        Andrés Pérez y David Gómez    16
                                           Indra y Extrema Sistemas


lunes 26 de marzo de 12
Comparación

                    GET http://server:port/zones/
                    POST http://server:port/zones/388
                    GET http://server:port/zones/388
                    PUT http://server:port/zones/388




                                                        Andrés Pérez y David Gómez    16
                                                           Indra y Extrema Sistemas


lunes 26 de marzo de 12
Comparación

                    GET http://server:port/zones/
                    POST http://server:port/zones/388
                    GET http://server:port/zones/388
                    PUT http://server:port/zones/388




                    http://server:port/listZones
                    http://server:port/createNewZone
                    http://server:port/getZone?id=388
                    http://server:port/updateZone?id=388




                                                           Andrés Pérez y David Gómez    16
                                                              Indra y Extrema Sistemas


lunes 26 de marzo de 12
(Spring) REST en el servidor




                                                Andrés Pérez y David Gómez    17
                                                   Indra y Extrema Sistemas


lunes 26 de marzo de 12
(Spring) REST en el servidor
                          <dependency>
                                 <groupId>org.springframework</groupId>
                                 <artifactId>spring-web</artifactId>
                                 <version>3.0.6.RELEASE</version>
                          </dependency>

                          <dependency>
                                 <groupId>org.springframework</groupId>
                                 <artifactId>spring-webmvc</artifactId>
                                 <version>3.0.6.RELEASE</version>
                          </dependency>

                          <dependency>
                                 <groupId>org.springframework</groupId>
                                 <artifactId>spring-oxm</artifactId>
                                 <version>3.0.6.RELEASE</version>
                          </dependency>




                                                                Andrés Pérez y David Gómez    17
                                                                   Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿Por qué REST con Spring?

      • Simplifica
            – la gestión de serialización
            – La gestión de códigos de error
            – Mapping de URLs a métodos
      • En cliente tenemos el RestTemplate




                                               Andrés Pérez y David Gómez    18
                                                  Indra y Extrema Sistemas


lunes 26 de marzo de 12
Un Controlador de Zona (I)




                                               Andrés Pérez y David Gómez    19
                                                  Indra y Extrema Sistemas


lunes 26 de marzo de 12
Un Controlador de Zona (I)
                   @Controller
                   public	
  class	
  ZoneController	
  {
                   	
  
                   	
   @Inject
                   	
   private	
  ZoneService	
  service;

                   	
     //	
  getZoneList	
  -­‐>	
  GET	
  
                   	
     @RequestMapping(value="/zones",	
  method=RequestMethod.GET)
                   	
     public	
  @ResponseBody	
  List<Zone>	
  getZones(){
                   	
     	
      return	
  service.findAll();
                   	
     }

                   	
     //	
  newZone	
  -­‐>	
  POST
                   	
     @RequestMapping(value	
  =	
  "/zones",	
  method	
  =	
  RequestMethod.POST)
                   	
     @ResponseStatus(HttpStatus.CREATED)
                   	
     public	
  void	
  newZone(@RequestBody	
  Zone	
  z,	
  
                   	
     	
      	
   HttpServletRequest	
  request,	
  HttpServletResponse	
  response)	
  {
                   	
     	
      service.save(z);
                   	
     	
      response.addHeader("Location",	
  
                   	
     	
      	
   	
          getLocationForChildResource(request,	
  order.getId()));

                   	
     }
                   }
                                                                                   Andrés Pérez y David Gómez    19
                                                                                      Indra y Extrema Sistemas


lunes 26 de marzo de 12
Un Controlador de Zona (II)




                                               Andrés Pérez y David Gómez    20
                                                  Indra y Extrema Sistemas


lunes 26 de marzo de 12
Un Controlador de Zona (II)
        @Controller
        public	
  class	
  ZoneController	
  {

        	
     //	
  newZone	
  -­‐>	
  POST
        	
     @RequestMapping(value	
  =	
  "/zones",	
  method	
  =	
  RequestMethod.POST)
        	
     @ResponseStatus(HttpStatus.CREATED)
        	
     public	
  void	
  newZone(@RequestBody	
  Zone	
  zone,	
  
        	
     	
      	
   HttpServletRequest	
  request,	
  HttpServletResponse	
  response)	
  {
        	
     	
      service.save(zone);
        	
     	
      response.addHeader("Location",	
  
        	
     	
      	
   	
          getLocationForChildResource(request,	
  zone.getId()));

        	
     }

        	
     private	
  String	
  getLocationForNewResource(HttpServletRequest	
  request,
                           	
  Object	
  identifier)	
  {
        	
     	
   StringBuffer	
  url	
  =	
  request.getRequestURL();
        	
     	
   UriTemplate	
  template	
  =	
  new	
  UriTemplate(url.append("/{zoneId}").toString());
        	
     	
   return	
  template.expand(identifier).toASCIIString();
        	
     }
        }


                                                                                   Andrés Pérez y David Gómez    20
                                                                                      Indra y Extrema Sistemas


lunes 26 de marzo de 12
Un Controlador de Zona (III)




                                                Andrés Pérez y David Gómez    21
                                                   Indra y Extrema Sistemas


lunes 26 de marzo de 12
Un Controlador de Zona (III)
                @Controller
                public	
  class	
  ZoneController	
  {
                	
   //	
  getZone	
  -­‐>	
  GET	
  
                	
   @RequestMapping(value="/zones/{id}",	
  method=RequestMethod.GET)
                	
   public	
  @ResponseBody	
  Zone	
  getZone(@PathVariable("id")	
  String	
  id)	
  {
                	
   	
      return	
  service.findById(id);
                	
   }	
  
                	
  
                	
   //	
  updateZone	
  -­‐>	
  PUT
                	
   @RequestMapping(value="/zones/{id}",	
  method=RequestMethod.PUT)
                	
   @ResponseStatus(HttpStatus.NO_CONTENT)
                	
   public	
  void	
  updateZone(@RequestBody	
  Zone	
  z)	
  {
                	
   	
      service.save(z);
                	
   }

                	
     //	
  delete	
  -­‐>	
  DELETE	
  
                	
     @RequestMapping(value="/zones/{id}",	
  method=RequestMethod.DELETE)
                	
     @ResponseStatus(HttpStatus.NO_CONTENT)	
  
                	
     public	
  void	
  deleteZone(@PathVariable("id")	
  String	
  id){
                	
     	
      service.removeById(id);
                	
     }	
  

                }

                                                                                   Andrés Pérez y David Gómez    21
                                                                                      Indra y Extrema Sistemas


lunes 26 de marzo de 12
Configuración




                                          Andrés Pérez y David Gómez    22
                                             Indra y Extrema Sistemas


lunes 26 de marzo de 12
Configuración


                   <?xml	
  version="1.0"	
  encoding="UTF-­‐8"?>
                   <beans	
  xmlns="http://www.springframework.org/schema/beans">

                   	
     <context:component-­‐scan	
  base-­‐package="com.vts.server"/>

                   	
     <bean	
  id="xstreamMarshaller"
                               	
  class="org.springframework.oxm.xstream.XStreamMarshaller"/>

                   	
     <mvc:annotation-­‐driven/>

                   </beans>




                                                                              Andrés Pérez y David Gómez    22
                                                                                 Indra y Extrema Sistemas


lunes 26 de marzo de 12
RestTemplate

      • Invocar servicios REST desde los GUI




                                         Andrés Pérez y David Gómez    23
                                            Indra y Extrema Sistemas


lunes 26 de marzo de 12
RestTemplate

      • Invocar servicios REST desde los GUI
                 @Component
                 public	
  class	
  RestZoneServiceInvoker	
  implements	
  ZoneServiceInvoker	
  {
                 	
  
                 	
  	
  	
  	
  	
  /*	
  "http://"	
  +	
  serverHostName	
  +	
  "/vts-­‐server/vts/zones"	
  */
                 	
                 private	
  String	
  baseURI;	
  
                 	
  
                 	
                 private	
  RestTemplate	
  restTemplate;

                 	
       @Inject
                 	
       public	
  RestZoneServiceInvoker(RestTemplate	
  restTemplate)	
  {
                 	
       	
   this.restTemplate	
  =	
  restTemplate;
                 	
       }
                 	
  
                 	
       @Override
                 	
       public	
  void	
  createNew(Zone	
  z)	
  {
                 	
       	
   URI	
  uri	
  =	
  restTemplate.postForLocation(baseURI,	
  z);
                 	
       }
                 }

                                                                                              Andrés Pérez y David Gómez    23
                                                                                                 Indra y Extrema Sistemas


lunes 26 de marzo de 12
RestTemplate
      • RestTemplate implements RestOperations




                                         Andrés Pérez y David Gómez    24
                                            Indra y Extrema Sistemas


lunes 26 de marzo de 12
RestTemplate
      • RestTemplate implements RestOperations
                 public	
  interface	
  RestOperations	
  {

                 	
       <T>	
  T	
  getForObject(String	
  url,	
  Class<T>	
  responseType,	
  
                                  Object...	
  uriVariables)	
  throws	
  RestClientException;

                 	
       HttpHeaders	
  headForHeaders(String	
  url,	
  Object...	
  uriVariables)	
  
                               throws	
  RestClientException;

                 	
       URI	
  postForLocation(String	
  url,	
  Object	
  request,	
  Object...	
  uriVariables)	
  
                                  throws	
  RestClientException;

                 	
       <T>	
  T	
  postForObject(String	
  url,	
  Object	
  request,	
  
                                                   Class<T>	
  responseType,	
  Map<String,	
  ?>	
  uriVariables)

                          void	
  put(String	
  url,	
  Object	
  request,	
  Object...	
  uriVariables)	
  
                                 throws	
  RestClientException;

                 	
       void	
  delete(String	
  url,	
  Object...	
  uriVariables)	
  
                                 throws	
  RestClientException;
                          ...
                 }
                                                                                            Andrés Pérez y David Gómez    24
                                                                                               Indra y Extrema Sistemas


lunes 26 de marzo de 12
Protobuf
                          Comunicación entre dispositivos y servidor/GUI
                                        .Net/C++/Java




                                                                            Speaker’s Name   25
                                                       Speaker mail – company or community


lunes 26 de marzo de 12
Protobuf. 2011-05-01.
                                 v 2.4.1
            Necesidades en la integración de módulos

      • Soluciones analizadas en la integración de
         módulos

      • Funcionamiento de la solución


                                            Andrés Pérez y David Gómez    26
                                               Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿qué necesitamos?

      • Sencillez
      • Alto rendimiento
      • Adaptabilidad
      • Compatibilidad con las distintas tecnologías de desarrollo
            – Controladores de dispositivos en C++
            – Servidor central y clientes en Java
            – Otros componentes sw (Servidores de video) en .Net




                                                     Andrés Pérez y David Gómez    27
                                                        Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿REST?

        REST, XML (Servidor java <-> Cliente java)
      • Pros:
        – Sencillez. Ampliamente extendido
        – Compatible con las tecnologías propuestas
        – Adaptabilidad
      • Contras:
        – rendimiento insuficiente para dispositivos

                                        Andrés Pérez y David Gómez    28
                                           Indra y Extrema Sistemas


lunes 26 de marzo de 12
Protocolos ‘ad hoc’
      • Pros:
            – Adaptabilidad:
                   • Modificaciones en código para cada actualización.
                   • Existen protocolos básados en bytes de especificación,
                     categorias ASTERIX de EUROCONTROL
            – Rendimiento
      • Contras
            – Dificultad, desarrollo de analizadores por tecnología.
            – Tiempo

                                                          Andrés Pérez y David Gómez    29
                                                             Indra y Extrema Sistemas


lunes 26 de marzo de 12
Protobuf
              Mecanismos automáticos de serialización de
                       estructuras de datos.


      •     Alto rendimiento,
      •     sencillez,
      •     adaptabilidad (campos optional),
      •     compatible con las tecnologías planteadas

                                           Andrés Pérez y David Gómez    30
                                              Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿Cómo funciona?


      • Definición de mensajes (estructuras de datos)
      • Generación de las clases de acceso a las
        estructuras de datos
      • Incorporación de las clases generadas al
        modelo




                                        Andrés Pérez y David Gómez    31
                                           Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿Cómo funciona?


      • Definición de mensajes (estructuras de datos)
      • Generación de las clases de acceso a las
        estructuras de datos
      • Incorporación de las clases generadas al
        modelo




                                        Andrés Pérez y David Gómez    32
                                           Indra y Extrema Sistemas


lunes 26 de marzo de 12
Definición de Mensajes

      • Archivos .proto (pares clave/valor)
        – clave: identificador del campo del mensaje
        – valor: de tipo
                   •   Números
                   •   Booleanos
                   •   bytes
                   •   mensaje anidado
            – Marcados como opcionales, obligatorios o repetidos


                                                Andrés Pérez y David Gómez    33
                                                   Indra y Extrema Sistemas


lunes 26 de marzo de 12
Definición de Mensajes

      • Archivos .proto (pares clave/valor)
        – clave: identificador del campo del mensaje
        – valor: de tipo
                   •   Números
                   •   Booleanos
                   •   bytes
                   •   mensaje anidado
            – Marcados como opcionales, obligatorios o repetidos
             http://code.google.com/intl/es-ES/apis/protocolbuffers/docs/proto.html

                                                                  Andrés Pérez y David Gómez    33
                                                                     Indra y Extrema Sistemas


lunes 26 de marzo de 12
Fichero .proto




                                           Andrés Pérez y David Gómez    34
                                              Indra y Extrema Sistemas


lunes 26 de marzo de 12
Fichero .proto
                          package	
  Controllers;
                          option	
  java_package	
  =	
  "com.vts.controller";
                          message	
  ControllerMessage	
  {
                          	
  	
  enum	
  CommandType	
  {	
  	
  	
  	
  INFO	
  =	
  0;	
  	
  	
  	
  CMD_1	
  =	
  1;	
  	
  	
  	
  CMD_2	
  =	
  2;	
  	
  	
  	
  CMD_3	
  =	
  3;	
  	
  	
  	
  
                          CMD_4	
  =	
  4;	
  	
  	
  	
  CMD_N	
  =	
  5;	
  	
  }
                          	
  	
  enum	
  ControllerType	
  {	
  	
  	
  	
  UNKNOWN	
  =	
  0;	
  	
  	
  	
  CONTROLLER_1	
  =	
  1;	
  	
  	
  	
  CONTROLLER_2	
  =	
  2;	
  	
                       	
  
                          CONTROLLER_3=	
  3;	
  	
  	
  	
  CONTROLLER_N	
  =	
  4;	
  	
  }
                          	
  	
  message	
  CommandValueDouble{
                          	
  	
  	
  	
  required	
  CommandType	
  commandType	
  =	
  1;
                          	
  	
  	
  	
  required	
  double	
  commandValue	
  =	
  2;
                          	
  	
  }
                          	
  	
  message	
  CommandValueBool{
                          	
  	
  	
  	
  required	
  CommandType	
  commandType	
  =	
  1;
                          	
  	
  	
  	
  required	
  bool	
  commandValue	
  =	
  2;
                          	
  	
  }
                          	
  	
  message	
  CommandValueString{
                          	
  	
  	
  	
  required	
  CommandType	
  commandType	
  =	
  1;
                          	
  	
  	
  	
  required	
  string	
  commandValue	
  =	
  2;
                          	
  	
  }
                          	
  	
  message	
  CommandValueInt32{
                          	
  	
  	
  	
  required	
  CommandType	
  commandType	
  =	
  1;
                          	
  	
  	
  	
  required	
  int32	
  commandValue	
  =	
  2;
                          	
  	
  }
                          	
  	
  required	
  string	
  idController	
  =	
  2;
                          	
  	
  required	
  ControllerType	
  controllerType	
  =	
  3;
                          	
  	
  repeated	
  CommandValueDouble	
  commandValueDouble	
  =	
  4;
                          	
  	
  repeated	
  CommandValueBool	
  commandValueBool	
  =	
  5;
                          	
  	
  repeated	
  CommandValueString	
  commandValueString	
  =	
  6;
                          	
  	
  repeated	
  CommandValueInt32	
  commandValueInt32	
  =	
  7;

                                                                                                                                                       Andrés Pérez y David Gómez                                34
                                                                                                                                                          Indra y Extrema Sistemas


lunes 26 de marzo de 12
Generación de las clases




                                             Andrés Pérez y David Gómez    35
                                                Indra y Extrema Sistemas


lunes 26 de marzo de 12
Incorporación de clases
                                a modelos
      • Posibilidades:
        – almacenamiento: de/a ficheros, BD, ...
            – comunicación: sockets.


      • Nuevos campos no rompen la compatibilidad




                                             Andrés Pérez y David Gómez    36
                                                Indra y Extrema Sistemas


lunes 26 de marzo de 12
Serialización a archivo en
                                     C++




                                               Andrés Pérez y David Gómez    37
                                                  Indra y Extrema Sistemas


lunes 26 de marzo de 12
Serialización a archivo en
                                           C++


  ControllerMessage	
  controllerMessage;
  controllerMessage.set_idController("123456");
  controllerMessage.set_controllerType(controllers::ControllerMessage_ControllerType_CONTROLLER_1);

  controllers::ControllerMessage_CommandValueString*	
  propiedad	
  =	
  
       controllerMessage.add_CommandValueString();

  controllerMessage-­‐>set_commandType(controllers::ControllerMessage_CommandType_CMD_2);
  controllerMessage-­‐>set_commandValue("VALOR_COMANDO");

  fstream	
  output("fichero.out",	
  ios::out	
  |	
  ios::binary);
  controllerMessage.SerializeToOstream(&output);




                                                                             Andrés Pérez y David Gómez    37
                                                                                Indra y Extrema Sistemas


lunes 26 de marzo de 12
Envío por Socket
                                C++




                                         Andrés Pérez y David Gómez    38
                                            Indra y Extrema Sistemas


lunes 26 de marzo de 12
Envío por Socket
                                                     C++
          ControllerMessage	
  controllerMessage;
          controllerMessage.set_commandType(controllers::ControllerMessage_CommandType_CMD_2);
          int	
  bufLength	
  =	
  controllerMessage.ByteSize();
          char*	
  buffer	
  =	
  new	
  char[bufLength];

          google::protobuf::io::ArrayOutputStream	
  arrayOutput(buffer,	
  bufLength);
          google::protobuf::io::CodedOutputStream	
  codedOutput(&arrayOutput);

          //Enviamos	
  primero	
  el	
  tamaño	
  del	
  mensaje	
  como	
  varInt32
          codedOutput.WriteVarint32(controllerMessage.ByteSize());

          //Y	
  luego	
  el	
  mensaje	
  en	
  sí
          controllerMessage.SerializeToCodedStream(&codedOutput);

          //codedOutput.ByteCount()	
  nos	
  dará	
  el	
  tamaño	
  del	
  búffer	
  más	
  
          //le	
  varint	
  que	
  indica	
  el	
  tamaño	
  del	
  mensaje
          iBufSize	
  =	
  codedOutput.ByteCount();
          socket-­‐>Send(buffer,	
  iBufSize);




                                                                                           Andrés Pérez y David Gómez    38
                                                                                              Indra y Extrema Sistemas


lunes 26 de marzo de 12
.Net




                                 Andrés Pérez y David Gómez    39
                                    Indra y Extrema Sistemas


lunes 26 de marzo de 12
.Net


            //Lectura	
  desde	
  stream
            TcpClient	
  cliente	
  =	
  new	
  TcpClient("192.168.250.50",	
  12345);
            ControllerMessage	
  newController;
            NetworkStream	
  stream	
  =	
  client.GetStream();
            newPerson	
  =	
  
                 Serializer.DeserializeWithLengthPrefix<Person>(stream,	
  PrefixStyle.Fixed32);
            <TRATAMIENTO	
  DE	
  LOS	
  CAMPOS>

            //Escritura	
  hacia	
  stream
            ControllerMessage	
  controller	
  =	
  newControllerMessage	
  Person	
  ();
            controller.IdController	
  =	
  “132465”;
            <ASIGNACION	
  DE	
  TODOS	
  LOS	
  VALORES	
  DESEADOS>
            Serializer.Serialize(client,	
  controller);




                                                                                  Andrés Pérez y David Gómez    39
                                                                                     Indra y Extrema Sistemas


lunes 26 de marzo de 12
Java




                                 Andrés Pérez y David Gómez    40
                                    Indra y Extrema Sistemas


lunes 26 de marzo de 12
Java

            	
  	
  	
  private	
  ObjectOutputStream	
  salida;
            	
  	
  	
  private	
  ObjectInputStream	
  entrada;
            	
  	
  	
  private	
  ServerSocket	
  servidor;
            	
  	
  	
  private	
  Socket	
  conexion;

            	
  	
  	
  public	
  void	
  readAndWriteMessage()	
  {
            	
                 	
  	
  	
  ControllerMessage	
  controllerMessage	
  =	
  null;
            	
                 	
  	
  	
  servidor	
  =	
  new	
  ServerSocket(	
  12345,	
  100	
  );
            	
                 	
  	
  	
  conexion	
  =	
  servidor.accept();
            	
                 	
  	
  	
  salida	
  =	
  new	
  ObjectOutputStream(	
  conexion.getOutputStream()	
  );	
  	
  	
  
            	
                 	
  	
  	
  entrada	
  =	
  new	
  ObjectInputStream(	
  conexion.getInputStream()	
  );
            	
                 	
  	
  	
  controllerMessage	
  =	
  ControllerMessage.parseDelimitedFrom(entrada);
            	
                 	
  	
  	
  	
  	
  	
  /*	
  TRATAMOS	
  LOS	
  CAMPOS	
  OPORTUNOS	
  */
            	
  	
  	
  	
  	
  	
  controllerMessage.writeDelimitedTo(salida);
            	
  	
  	
  }




                                                                                                        Andrés Pérez y David Gómez     40
                                                                                                           Indra y Extrema Sistemas


lunes 26 de marzo de 12
JMS
                          Comunicación del Servidor a GUI




                                                                    Speaker’s Name   41
                                               Speaker mail – company or community


lunes 26 de marzo de 12
El uso

      • El servidor envía avisos a los puestos:
            – Creación de zonas
            – Alarmas
            – Actualizaciones de posición de barcos

      • ¿y si pregunto cada cierto tiempo? (Polling)
            – La escalabilidad se resiente.


                                              Andrés Pérez y David Gómez    42
                                                 Indra y Extrema Sistemas


lunes 26 de marzo de 12
JMS

      • JMS es la forma en enviar mensajes en Java

          Consumer
                          Destination   Topic/   Destination             Producer
                                        Queue




                                                       Andrés Pérez y David Gómez    43
                                                          Indra y Extrema Sistemas


lunes 26 de marzo de 12
JMS

      • JMS es la forma en enviar mensajes en Java

          Consumer
                          Destination   Topic/   Destination             Producer
                                        Queue
           Consumer




                                                       Andrés Pérez y David Gómez    43
                                                          Indra y Extrema Sistemas


lunes 26 de marzo de 12
JMS

      • JMS es la forma en enviar mensajes en Java

          Consumer
                          Destination   Topic/   Destination             Producer
                                        Queue
           Consumer


                                        Topic/
                                        Queue


                                                       Andrés Pérez y David Gómez    44
                                                          Indra y Extrema Sistemas


lunes 26 de marzo de 12
JMS

      • JMS es la forma en enviar mensajes en Java

          Consumer
                          Destination   Topic/   Destination             Producer
                                        Queue
           Consumer


           Consumer                     Topic/
                                        Queue


                                                       Andrés Pérez y David Gómez    44
                                                          Indra y Extrema Sistemas


lunes 26 de marzo de 12
JMS

      • JMS es la forma en enviar mensajes en Java

          Consumer
                          Destination   Topic/   Destination             Producer
                                        Queue
           Consumer


           Consumer                     Topic/
                                        Queue


                                                       Andrés Pérez y David Gómez    44
                                                          Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿JMS a pelo?




      • Demasiado código para enviar un mensaje:
             •   Creación de conexiónes, serialización, gestión deerrores, liberación de
                 recursos

                                                              Andrés Pérez y David Gómez    45
                                                                 Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿JMS a pelo?

            Connection	
  conn	
  =	
  connectionFactory.createConnection();

            Session	
  session	
  =	
  conn.createSession(transactional,	
  ackMode);

            ObjectMessage	
  message	
  =	
  session.createObjectMessage(myMessageObject);

            Message	
  Producer	
  producer	
  =	
  session.createProducer(topicName);

            producer.send(message);




      • Demasiado código para enviar un mensaje:
             •   Creación de conexiónes, serialización, gestión deerrores, liberación de
                 recursos

                                                                               Andrés Pérez y David Gómez    45
                                                                                  Indra y Extrema Sistemas


lunes 26 de marzo de 12
JMS con Spring
                            JMSTemplate
      • Se encarga de:
            – Obtención de la conexión,
            – Serialización del mensaje
            – Envío al tópico/Cola
            – Gestión de errores
      • Se apoya en
            – MessageConverter
            – DestinationResolver

                                            Andrés Pérez y David Gómez    46
                                               Indra y Extrema Sistemas


lunes 26 de marzo de 12
Dependencias




                                         Andrés Pérez y David Gómez    47
                                            Indra y Extrema Sistemas


lunes 26 de marzo de 12
Dependencias


                          <dependency>
                                 <groupId>org.apache.activemq</groupId>
                                 <artifactId>activemq-core</artifactId>
                                 <version>5.5.0</version>
                          </dependency>

                          <dependency>
                                 <groupId>org.springframework</groupId>
                                 <artifactId>spring-jms</artifactId>
                                 <version>3.0.6.RELEASE</version>
                          </dependency>




                                                                Andrés Pérez y David Gómez    47
                                                                   Indra y Extrema Sistemas


lunes 26 de marzo de 12
Configuracion




                                          Andrés Pérez y David Gómez    48
                                             Indra y Extrema Sistemas


lunes 26 de marzo de 12
Configuracion

              <?xml	
  version="1.0"	
  encoding="UTF-­‐8"?>
              <beans>

              	
     <bean	
  name="jmsTemplate"	
  class="org.springframework.jms.core.JmsTemplate">
              	
     	
       <property	
  name="connectionFactory"	
  ref="jmsConnectionFactory"	
  />
              	
     	
       <property	
  name="defaultDestinationName"	
  value="#{globalTopic.topicName}"/>
              	
     	
       <property	
  name="defaultDestination"	
  ref="globalTopic"/>
              	
     	
       <property	
  name="receiveTimeout"	
  value="1"	
  />
              	
     	
       <property	
  name="pubSubDomain"	
  value="true"/>
              	
     	
       <property	
  name="messageConverter"	
  ref="jmsMessageConverter"/>
              	
     </bean>
              	
     <bean	
  name="jmsMessageConverter"	
  
              	
     	
       	
    class="org.springframework.jms.support.converter.MarshallingMessageConverter">
              	
     	
       <property	
  name="marshaller"	
  ref="xstreamMarshaller"/>
              	
     	
       <property	
  name="unmarshaller"	
  ref="xstreamMarshaller"/>
              	
     </bean>

              	
     <bean	
  name="jmsEventEmitter"	
  class="com.vts.jms.JmsEventEmitter"/>	
  

              </beans>




                                                                                             Andrés Pérez y David Gómez    48
                                                                                                Indra y Extrema Sistemas


lunes 26 de marzo de 12
EventEmitter




                                         Andrés Pérez y David Gómez    49
                                            Indra y Extrema Sistemas


lunes 26 de marzo de 12
EventEmitter
              public	
  class	
  JmsEventEmitter	
  
              	
   	
     implements	
  CameraEventListener,	
  TrafficEventListener,	
  ...	
  {

              	
     private	
  JmsTemplate	
  jmsTemplate;

              	
     private	
  List<ResponsibilityArea>	
  areas	
  =	
  new	
  ArrayList<ResponsibilityArea>();

              	
     private	
  void	
  sendJmsEvent(Locatable	
  event)	
  {
              	
     	
   if	
  (event.getGeoPoint()	
  ==	
  null)	
  {
              	
     	
   	
      //events	
  with	
  no	
  location	
  should	
  be	
  sent	
  to	
  the	
  defaultDestination
              	
     	
   	
      jmsTemplate.convertAndSend(event);
              	
     	
   }	
  else	
  {
              	
     	
   	
      sendToApplicableAreas(event);
              	
     	
   }
              	
     }

              	
     @Override
              	
     public	
  void	
  onTrafficEvent(TrafficEvent	
  event)	
  {
              	
     	
   sendJmsEvent(event);
              	
     }

              }


                                                                                           Andrés Pérez y David Gómez             49
                                                                                              Indra y Extrema Sistemas


lunes 26 de marzo de 12
Para recibir en el cliente




                                                Andrés Pérez y David Gómez    50
                                                   Indra y Extrema Sistemas


lunes 26 de marzo de 12
Para recibir en el cliente
        <beans>
        	
   <bean	
  id="jmsConnectionFactory"	
  class="org.apache.activemq.ActiveMQConnectionFactory">
        	
   	
   <property	
  name="brokerURL"	
  
                         value="tcp://#{systemProperties['jmsHost']?:'localhost'}:61616"/>
        	
   </bean>

        	
     <jms:listener-­‐container	
  
        	
     	
   	
   connection-­‐factory="jmsConnectionFactory"
        	
     	
   	
   destination-­‐type="topic"
        	
     	
   	
   message-­‐converter="jmsMessageConverter">
        	
     	
   <jms:listener	
  ref="jmsListener"	
  method="receiveMessage"	
  
                         destination="globalTopic"/>
        	
     	
   <jms:listener	
  ref="jmsListener"	
  method="receiveMessage"	
  	
  	
  	
  
                         destination="#{systemProperties['responsibilityArea']?:'area0'}"/>
        	
     </jms:listener-­‐container>


        	
     <bean	
  id="jmsListener"	
  class="com.vts.jms.JmsAreaListener"/>

        </beans>



                                                                           Andrés Pérez y David Gómez    50
                                                                              Indra y Extrema Sistemas


lunes 26 de marzo de 12
Para recibir en el cliente




                                                Andrés Pérez y David Gómez    51
                                                   Indra y Extrema Sistemas


lunes 26 de marzo de 12
Para recibir en el cliente


              public	
  class	
  JmsAreaListener	
  {

              	
      public	
  void	
  receiveMessage(Object	
  o)	
  {
              	
      	
    if	
  (o	
  instanceof	
  AisTrackPoint)	
  {
              	
      	
    	
      trackPointEventSupport.fire((AisTrackPoint)o);
              	
      	
    }	
  else	
  if	
  (o	
  instanceof	
  StaticAisMessage)	
  {
              	
      	
    	
      staticAisMessageEventSupport.fire((StaticAisMessage)o);
              	
      	
    }	
  
              	
      }	
  
              }	
  




                                                                            Andrés Pérez y David Gómez    51
                                                                               Indra y Extrema Sistemas


lunes 26 de marzo de 12
¡Cuidado con las conexiones!

      • JMSTemplate abre y cierra nuevas conexiones
        por cada envío
      • Solución: PoolConnectionFactory




                                               Andrés Pérez y David Gómez    52
                                                  Indra y Extrema Sistemas


lunes 26 de marzo de 12
¡Cuidado con las conexiones!

      • JMSTemplate abre y cierra nuevas conexiones
        por cada envío
      • Solución: PoolConnectionFactory

          <bean	
  id="jmsConnectionFactory"	
  
          	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  class="org.springframework.jms.connection.CachingConnectionFactory">
          	
  	
  	
  	
  <property	
  name="targetConnectionFactory">
          	
  	
  	
  	
  	
  	
  	
  	
  <bean	
  class="org.apache.activemq.ActiveMQConnectionFactory">
          	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <property	
  name="brokerURL"	
  
                                                            	
  	
  	
  value="tcp://#{systemProperties['jmsHost']?:'localhost'}:61616"/>
          	
  	
  	
  	
  	
  	
  	
  	
  </bean>
          	
  	
  	
  	
  </property>
          </bean>




                                                                                                   Andrés Pérez y David Gómez               52
                                                                                                      Indra y Extrema Sistemas


lunes 26 de marzo de 12
MongoDB


                                                    Speaker’s Name   53
                               Speaker mail – company or community


lunes 26 de marzo de 12
¿Por qué NoSQL?
                          Teorema CAP (Eric Brewer)




                                                                     Source: Nathan Hurst’s Blog


                                                Andrés Pérez y David Gómez                54
                                                   Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿Por qué NoSQL?
                                        Teorema CAP (Eric Brewer)
                          Consistency

                             C




                                                                                   Source: Nathan Hurst’s Blog


                                                              Andrés Pérez y David Gómez                54
                                                                 Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿Por qué NoSQL?
                                        Teorema CAP (Eric Brewer)
                          Consistency                                 Availability

                             C                                            A




                                                                                   Source: Nathan Hurst’s Blog


                                                              Andrés Pérez y David Gómez                54
                                                                 Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿Por qué NoSQL?
                                        Teorema CAP (Eric Brewer)
                          Consistency                                      Availability

                             C                                                 A



                                                    P
                                             Partition Tolerance
                                                                                        Source: Nathan Hurst’s Blog


                                                                   Andrés Pérez y David Gómez                54
                                                                      Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿Por qué NoSQL?
                                        Teorema CAP (Eric Brewer)
                          Consistency                                      Availability

                             C                                                 A



                                                    P
                                             Partition Tolerance
                                                                                        Source: Nathan Hurst’s Blog


                                                                   Andrés Pérez y David Gómez                54
                                                                      Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿Por qué NoSQL?
                                        Teorema CAP (Eric Brewer)
                          Consistency                                      Availability

                             C                                                 A
                                                Sólo
                                                 2

                                                    P
                                             Partition Tolerance
                                                                                        Source: Nathan Hurst’s Blog


                                                                   Andrés Pérez y David Gómez                54
                                                                      Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿Por qué NoSQL?
                                        Teorema CAP (Eric Brewer)
                          Consistency                                      Availability

                                                                               A
                                              Oracle, MySQL,
                             C
                                                Sólo
                                                 2

                                                    P
                                             Partition Tolerance
                                                                                        Source: Nathan Hurst’s Blog


                                                                   Andrés Pérez y David Gómez                54
                                                                      Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿Por qué NoSQL?
                                        Teorema CAP (Eric Brewer)
                          Consistency                                           Availability

                                                                                    A
                                                      Oracle, MySQL,
                             C
                              M Hyp is, M
                               on er em                Sólo
                                                        2
                                 go Ta c
                             Re


                                   DB ble ac
                                    d


                                      , D , H heD
                                         at Ba B
                                           aS se
                                             to
                                               re
                                                  ,


                                                           P
                                                  Partition Tolerance
                                                                                             Source: Nathan Hurst’s Blog


                                                                        Andrés Pérez y David Gómez                54
                                                                           Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿Por qué NoSQL?
                                        Teorema CAP (Eric Brewer)
                          Consistency                                                Availability

                                                                                         A
                                                      Oracle, MySQL,
                             C
                              M Hyp is, M              Sólo




                                                                                              ,
                               on er em




                                                                                uc ra, ort
                                                        2




                                                                                           aK
                                 go Ta c




                                                                              Co nd m
                             Re




                                                                                        Ri
                                   DB ble ac




                                                                            B, a de
                                    d




                                                                                     B,
                                                                           D ass ol
                                      , D , H heD




                                                                                  hD
                                                                        ple C o,V
                                         at Ba B




                                                                               am
                                           aS se
                                             to




                                                                        yn
                                               re




                                                                        D
             RDBMS
                                                  ,

     Orientadas a documento
                                                           P

                                                                        Sim
      orientadas a columna
            Key-Value
                                                  Partition Tolerance
                                                                                                  Source: Nathan Hurst’s Blog


                                                                             Andrés Pérez y David Gómez                54
                                                                                Indra y Extrema Sistemas


lunes 26 de marzo de 12
Tipos


      orientadas a Columna       orientadas a Documento




                  Key-value           orientadas a Grafos


                                         Andrés Pérez y David Gómez    55
                                            Indra y Extrema Sistemas


lunes 26 de marzo de 12
¿Por qué MongoDB?

      • Orientada a Documentos
            – heterogéneos
            – Representados en formato JSON (o BSON)
      • Almacenados en Colecciones (no tablas)
      • Un poco de SQL:
            – queries, índices, Referencias externas
      • Optimizada para escrituras

                                (cc) Photo by Ampersand Duck - http://www.flickr.com/photos/ampersandduck/4941185476

                                                                 Andrés Pérez y David Gómez              56
                                                                    Indra y Extrema Sistemas


lunes 26 de marzo de 12
Documentos JSON
                     Identificados por un _id
                     Heterogeneos: Identificamos el tipo con _class




                                                        Andrés Pérez y David Gómez    57
                                                           Indra y Extrema Sistemas


lunes 26 de marzo de 12
Documentos JSON
                     Identificados por un _id
                     Heterogeneos: Identificamos el tipo con _class

                    { "_id" : "224000999",
                      "_class" : "com.vts.model.Vessel",
                      "flag" : "ALBANIA",
                      "name" : "Sample NOT_AVAILABLE Vessel 224000999",
                      "callsign" : "SV224000999",
                      "toBow" : 25,
                      "toStern" : 5,
                      "toPort" : 5,
                      "toStarboard" : 5,
                      "comments" : "Sample vessel created automatically for test purposes"
                    }




                                                                     Andrés Pérez y David Gómez    57
                                                                        Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consola JS




                                       Andrés Pérez y David Gómez    58
                                          Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consola JS
          beleriand:bin dgomez$ ./mongo
          MongoDB shell version: 1.8.1
          connecting to: test
          >




                                                       Andrés Pérez y David Gómez    58
                                                          Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consola JS
          beleriand:bin dgomez$ ./mongo
          MongoDB shell version: 1.8.1
          connecting to: test
          > use vts
          switched to db vts
          >




                                                       Andrés Pérez y David Gómez    58
                                                          Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consola JS
          beleriand:bin dgomez$ ./mongo
          MongoDB shell version: 1.8.1
          connecting to: test
          > use vts
          switched to db vts
          > show collections
          >
          Event
          WeatherData
          system.indexes
          vessel
          >




                                                       Andrés Pérez y David Gómez    58
                                                          Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consola JS
          beleriand:bin dgomez$ ./mongo
          MongoDB shell version: 1.8.1
          connecting to: test
          > use vts
          switched to db vts
          > show collections
          >
          Event
          WeatherData
          system.indexes
          vessel
          > db.Event.find()
          >
          { "_id" : ObjectId("4e0b5b211446446f6be3bb1a"),   "_class" :
          "com.vts.model.events.SystemEvent", "timestamp"   :
          ISODate("2011-06-29T17:04:33.039Z") }
          { "_id" : ObjectId("4e0b5b3d144676f49946443f"),   "_class" :
          "com.vts.model.events.SystemEvent", "timestamp"   :
          ISODate("2011-06-29T17:05:01.394Z") }
          >


                                                                 Andrés Pérez y David Gómez    58
                                                                    Indra y Extrema Sistemas


lunes 26 de marzo de 12
SpringData y MongoDB

             XML namespace para configurar driver Mongo
             MongoTemplate
             Conversión de excepciones automática
             Conversión Configurable
             JMX monitoring


                                           Andrés Pérez y David Gómez    59
                                              Indra y Extrema Sistemas


lunes 26 de marzo de 12
Importando Spring Data




                                            Andrés Pérez y David Gómez    60
                                               Indra y Extrema Sistemas


lunes 26 de marzo de 12
Importando Spring Data




                          <dependency>
                                 <groupId>org.mongodb</groupId>
                                 <artifactId>mongo-java-driver</
                                 artifactId>
                                 <version>2.7.0-rc1</version>
                          </dependency>




                                                                   Andrés Pérez y David Gómez    60
                                                                      Indra y Extrema Sistemas


lunes 26 de marzo de 12
Importando Spring Data


                      <repository>
                          <id>spring-release</id>
                          <name>Spring Maven Release Repository</name>
                             <dependency>
                          <url>http://repo.springsource.org/libs-release</url>
                      </repository> <groupId>org.mongodb</groupId>
                                    <artifactId>mongo-java-driver</
                      <dependency> artifactId>
                                    <version>2.7.0-rc1</version>
                          <groupId>org.springframework.data</groupId>
                             </dependency>
                          <artifactId>spring-data-mongodb</artifactId>
                          <version>1.0.1.RELEASE</version>
                      </dependency>




                                                                   Andrés Pérez y David Gómez    60
                                                                      Indra y Extrema Sistemas


lunes 26 de marzo de 12
Configuración.
                          Spring Namespace




                                         Andrés Pérez y David Gómez    61
                                            Indra y Extrema Sistemas


lunes 26 de marzo de 12
Configuración.
                                                     Spring Namespace
          <?xml	
  version="1.0"	
  encoding="UTF-­‐8"?>
          <beans	
  xmlns="http://www.springframework.org/schema/beans"
          	
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-­‐instance"	
  
          	
                 xmlns:mongo="http://www.springframework.org/schema/data/mongo"
          	
                 xmlns:context="http://www.springframework.org/schema/context"
          	
                 xsi:schemaLocation="http://www.springframework.org/schema/beans	
  
          	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  http://www.springframework.org/schema/beans/spring-­‐beans.xsd
          	
                 	
                	
                 	
                 	
  	
  http://www.springframework.org/schema/data/mongo
          	
                 	
                	
                 	
                 	
  	
  http://www.springframework.org/schema/data/mongo/spring-­‐mongo-­‐1.0.xsd
          	
                 	
                	
                 	
  	
  	
  	
  	
  	
  	
  http://www.springframework.org/schema/context
          	
                 	
                	
                 	
                 	
  	
  http://www.springframework.org/schema/context/spring-­‐context.xsd">




          </beans>



                                                                                                               Andrés Pérez y David Gómez                       61
                                                                                                                  Indra y Extrema Sistemas


lunes 26 de marzo de 12
Configuración.
                                                     Spring Namespace
          <?xml	
  version="1.0"	
  encoding="UTF-­‐8"?>
          <beans	
  xmlns="http://www.springframework.org/schema/beans"
          	
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-­‐instance"	
  
          	
                 xmlns:mongo="http://www.springframework.org/schema/data/mongo"
          	
                 xmlns:context="http://www.springframework.org/schema/context"
          	
                 xsi:schemaLocation="http://www.springframework.org/schema/beans	
  
          	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  http://www.springframework.org/schema/beans/spring-­‐beans.xsd
          	
                 	
                	
                 	
                 	
  	
  http://www.springframework.org/schema/data/mongo
          	
                 	
                	
                 	
                 	
  	
  http://www.springframework.org/schema/data/mongo/spring-­‐mongo-­‐1.0.xsd
          	
                 	
                	
                 	
  	
  	
  	
  	
  	
  	
  http://www.springframework.org/schema/context
          	
                 	
                	
                 	
                 	
  	
  http://www.springframework.org/schema/context/spring-­‐context.xsd">

                <mongo:db-­‐factory	
  dbname="vts"/>




          </beans>



                                                                                                               Andrés Pérez y David Gómez                       61
                                                                                                                  Indra y Extrema Sistemas


lunes 26 de marzo de 12
Configuración.
                                                           Spring Namespace
                <?xml	
  version="1.0"	
  encoding="UTF-­‐8"?>
                <beans	
  xmlns="http://www.springframework.org/schema/beans"
                	
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-­‐instance"	
  
                	
                 xmlns:mongo="http://www.springframework.org/schema/data/mongo"
                	
                 xmlns:context="http://www.springframework.org/schema/context"
                	
                 xsi:schemaLocation="http://www.springframework.org/schema/beans	
  
                	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  http://www.springframework.org/schema/beans/spring-­‐beans.xsd
                	
                 	
                	
                 	
                 	
  	
  http://www.springframework.org/schema/data/mongo
                	
                 	
                	
                 	
                 	
  	
  http://www.springframework.org/schema/data/mongo/spring-­‐mongo-­‐1.0.xsd
                	
                 	
                	
                 	
  	
  	
  	
  	
  	
  	
  http://www.springframework.org/schema/context
                	
                 	
                	
                 	
                 	
  	
  http://www.springframework.org/schema/context/spring-­‐context.xsd">

                      <mongo:db-­‐factory	
  dbname="vts"/>
         	
           <bean	
  id="mongoTemplate"	
  class="org.springframework.data.mongodb.core.MongoTemplate">
         	
           	
   <constructor-­‐arg	
  name="mongoDbFactory"	
  ref="mongoDbFactory"	
  />
         	
           </bean>


                </beans>



                                                                                                                     Andrés Pérez y David Gómez                       61
                                                                                                                        Indra y Extrema Sistemas


lunes 26 de marzo de 12
Spring’s MongoTemplate

          <bean	
  id="mongoTemplate"	
  class="org.springframework.data.mongodb.core.MongoTemplate">
          	
   <constructor-­‐arg	
  name="mongoDbFactory"	
  ref="mongoDbFactory"	
  />
          </bean>


                                     Identifica la colección
                                 Convierte query a JSON
                          Convierte respuesta (“_class”)
                          Gestiona las conexiones y cursores
                                Convierte las excepciones
                                                                        Andrés Pérez y David Gómez      62
                                                                           Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consultas
         RDBMS:           SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;




                                                                                              63



                                                                Andrés Pérez y David Gómez
                                                                   Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consultas
         RDBMS:           SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;

                                       { “flag” : “ALBANIA” }
         Mongo:




                                                                                              63



                                                                Andrés Pérez y David Gómez
                                                                   Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consultas
         RDBMS:           SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;

                                       { “flag” : “ALBANIA” }
         Mongo:

         Mongo            DBCollection vessels = db.getCollection("vessel");

                          DBObject query = new BasicDBObject();
         Driver:          query.put("flag", "ALBANIA");

                          DBCursor albanianShips = vessels.find(query);
                          while (albanianShips.hasNext()) {
                                DBObject result = albanianShips.next();
                             	 // Create Vessel object from DBObject
                          }


                                                                                                63



                                                                  Andrés Pérez y David Gómez
                                                                     Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consultas
         RDBMS:              SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;

                                          { “flag” : “ALBANIA” }
         Mongo:




         Spring
                          Query query = new Query(Criteria.where("flag").is("ALBANIA");
         Mongo
                          List<Vessel> vessels = mongoTemplate.find(query, Vessel.class);

         Template:
                                                                                                  63



                                                                    Andrés Pérez y David Gómez
                                                                       Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consultas
         RDBMS:              SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;

                                          { “flag” : “ALBANIA” }
         Mongo:
                                                      Utilizado para
                                                           Identificación de la colección
                                                           Serialización JSON
         Spring
                          Query query = new Query(Criteria.where("flag").is("ALBANIA");
         Mongo
                          List<Vessel> vessels = mongoTemplate.find(query, Vessel.class);

         Template:
                                                                                                  63



                                                                    Andrés Pérez y David Gómez
                                                                       Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consultas complejas
        RDBMS:




                                           Andrés Pérez y David Gómez    64
                                              Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consultas complejas
                          SELECT * FROM VESSELS WHERE length < 90 AND length > 30
        RDBMS:            ORDER BY lastUpdate;


        Mongo:




                                                                        Andrés Pérez y David Gómez    64
                                                                           Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consultas complejas
                          SELECT * FROM VESSELS WHERE length < 90 AND length > 30
        RDBMS:            ORDER BY lastUpdate;


        Mongo:                       {
                                         “length” : { $lt : 90, $gt : 30}
                                     }
        Mongo
        Driver:




                                                                            Andrés Pérez y David Gómez    64
                                                                               Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consultas complejas
                          SELECT * FROM VESSELS WHERE length < 90 AND length > 30
        RDBMS:            ORDER BY lastUpdate;


        Mongo:                       {
                                         “length” : { $lt : 90, $gt : 30}
                                     }
        Mongo                    DBObject query = new BasicDBObject();
                                 DBObject condition = new BasicDBObject("$lt",90);
        Driver:                  condition.put("$gt",30);
                                 query.put("length", condition);

                                 DBObject [] flags = {
                                 new BasicDBObject("flag", "ALBANIA"),
                                      new BasicDBObject("flag", "SAN MARINO")
                                 };
                                 query.put("$or", flags);

                                 vessels.find(query);



                                                                            Andrés Pérez y David Gómez    64
                                                                               Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consultas complejas
                          SELECT * FROM VESSELS WHERE length < 90 AND length > 30
        RDBMS:            ORDER BY lastUpdate;


        Mongo:                       {
                                         “length” : { $lt : 90, $gt : 30}
                                     }




                                                                            Andrés Pérez y David Gómez    64
                                                                               Indra y Extrema Sistemas


lunes 26 de marzo de 12
Consultas complejas
                          SELECT * FROM VESSELS WHERE length < 90 AND length > 30
        RDBMS:            ORDER BY lastUpdate;


        Mongo:                       {
                                         “length” : { $lt : 90, $gt : 30}
                                     }




                             Criteria criteria = Criteria.where("length");
                             criteria.gte(from);
        Spring               criteria.lte(to);


        Mongo                Query query = new Query(criteria);
                             query.sort().on("lastUpdate", Order.ASCENDING);

        Template:            List<Vessel> vessels = mongoTemplate.find(query, Vessel.class);




                                                                            Andrés Pérez y David Gómez    64
                                                                               Indra y Extrema Sistemas


lunes 26 de marzo de 12
Inserciones




                                        Andrés Pérez y David Gómez    65
                                           Indra y Extrema Sistemas


lunes 26 de marzo de 12
Inserciones



    public class MongoTemplate implements MongoOperations, ApplicationContextAware {

    	     public void save(Object objectToSave)

    	     public void save(Object objectToSave, String collectionName)

    }




                                                               Andrés Pérez y David Gómez    65
                                                                  Indra y Extrema Sistemas


lunes 26 de marzo de 12
AbstractRepository




                                          Andrés Pérez y David Gómez    66
                                             Indra y Extrema Sistemas


lunes 26 de marzo de 12
AbstractRepository

      public abstract class AbstractMongoRepository<T> {

      	     @Inject
      	     protected MongoTemplate mongoTemplate;
      	
      	     /** Clase que utiliza Mongo para identificar el nombre de la coleccion */
      	     private Class<T> persistentClass;

      	     protected AbstractService(Class<T> persistentClass) {
      	     	   this.persistentClass = persistentClass;
      	     }

      	     public String determineCollection() {
      	     	   return persistentClass.getSimpleName();
      	     }
      }



                                                               Andrés Pérez y David Gómez    66
                                                                  Indra y Extrema Sistemas


lunes 26 de marzo de 12
AbstractRepository (II)




                                              Andrés Pérez y David Gómez    67
                                                 Indra y Extrema Sistemas


lunes 26 de marzo de 12
AbstractRepository (II)
      public abstract class AbstractMongoRepository<T> {

      	     public void save(T e) {
      	     	   mongoTemplate.save(e, determineCollection());
      	     }
      	     	
      	     public void removeById(String id) {
      	     	   Object e = findById(id);
      	     	   if (e != null) {	 	   	
      	     	   	    mongoTemplate.remove(e, determineCollection());
      	     	   }	
      	     }
      	
      	     public T findById(String id) {
      	     	   T t = mongoTemplate.findById(id, persistentClass);
      	     	   if (t == null) {
      	     	   	    throw new ObjectNotFoundException(persistentClass, id);
      	     	   }
      	     	   return t;
      	     }
                                                                Andrés Pérez y David Gómez
      }                                                            Indra y Extrema Sistemas
                                                                                              67

lunes 26 de marzo de 12
VesselRepository




                                         Andrés Pérez y David Gómez    68
                                            Indra y Extrema Sistemas


lunes 26 de marzo de 12
VesselRepository




      public class VesselRepository extends AbstractMongoRepository<Vessel> {

      	     public VesselRepository() {
      	     	   super(Vessel.class);
      	     }

      }




                                                             Andrés Pérez y David Gómez    68
                                                                Indra y Extrema Sistemas


lunes 26 de marzo de 12
A tener en cuenta

      • Cuidado con los campos transient
            – La serializacion object <-> JSON se hace por
              reflexión
            – Registrar un custom Converter
      • Queries con multiples valores




                                              Andrés Pérez y David Gómez    69
                                                 Indra y Extrema Sistemas


lunes 26 de marzo de 12
A tener en cuenta

      • Cuidado con los campos transient
            – La serializacion object <-> JSON se hace por
              reflexión
            – Registrar un custom Converter
      • Queries con multiples valores
                          Query query = new Query(
                          	   Criteria
                          	   	    .where("length").gte(20)
                          	   	    .and("length").lt(60));




                                                              Andrés Pérez y David Gómez    69
                                                                 Indra y Extrema Sistemas


lunes 26 de marzo de 12
A tener en cuenta

      • Cuidado con los campos transient
            – La serializacion object <-> JSON se hace por
              reflexión
            – Registrar un custom Converter
      • Queries con multiples valores




                                              Andrés Pérez y David Gómez    69
                                                 Indra y Extrema Sistemas


lunes 26 de marzo de 12
A tener en cuenta

      • Cuidado con los campos transient
            – La serializacion object <-> JSON se hace por
              reflexión
            – Registrar un custom Converter
      • Queries con multiples valores
                          Query query = new Query(
                          	   Criteria
                          	   	    .where("length").gte(20).lte(60));




                                                              Andrés Pérez y David Gómez    69
                                                                 Indra y Extrema Sistemas


lunes 26 de marzo de 12
Q&A


                                                     Speaker’s Name   70
                                Speaker mail – company or community


lunes 26 de marzo de 12

Más contenido relacionado

PDF
Kerry Ow Buland - Curriculum Vitae
PPTX
PPMA 2013 Annual Seminar - Nick Heckscher - Talent and Young people
PPTX
Content Skeletons in Your Redesign Closet
DOCX
Mi primer documento de word
PDF
Rpk54.3 Gkm Entscheidung Wasserrecht
PDF
Hyper Hyper Webmontag Mrn Roland Fiege
PDF
Kpm company profile
PDF
Bai giang cau truc pc
Kerry Ow Buland - Curriculum Vitae
PPMA 2013 Annual Seminar - Nick Heckscher - Talent and Young people
Content Skeletons in Your Redesign Closet
Mi primer documento de word
Rpk54.3 Gkm Entscheidung Wasserrecht
Hyper Hyper Webmontag Mrn Roland Fiege
Kpm company profile
Bai giang cau truc pc

Destacado (12)

PDF
Programa invierno cultural 2012
PDF
Legacy Magazine 2015
PDF
Voiceover: un anno di social sentiment e cinema
PPSX
Presentación elvira franco
DOCX
Simiatug
PPT
GdT Atención Paliativa Gijón 2015
PDF
AGENDA INSTITUCIONAL
DOC
Abd al rahman ibn jaldun de juan jose tamayo
PDF
Gastronomia de-burgos
PDF
Boletin de bienvenida
DOCX
Manual Tecnico de Informatica w
PDF
Consideraciones para escribir un articulo
Programa invierno cultural 2012
Legacy Magazine 2015
Voiceover: un anno di social sentiment e cinema
Presentación elvira franco
Simiatug
GdT Atención Paliativa Gijón 2015
AGENDA INSTITUCIONAL
Abd al rahman ibn jaldun de juan jose tamayo
Gastronomia de-burgos
Boletin de bienvenida
Manual Tecnico de Informatica w
Consideraciones para escribir un articulo
Publicidad

Más de David Gómez García (20)

PDF
Leverage CompletableFutures to handle async queries. DevNexus 2022
PDF
Building Modular monliths that could scale to microservices (only if they nee...
PDF
Building modular monoliths that could scale to microservices (only if they ne...
PDF
Leveraging Completable Futures to handle your query results Asynchrhonously
PDF
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
PDF
Cdm mil-18 - hypermedia ap is for headless platforms and data integration
PDF
What's in a community like Liferay's
PDF
Java9 Beyond Modularity - Java 9 más allá de la modularidad
PDF
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
PDF
Managing user's data with Spring Session
PDF
Parallel streams in java 8
PDF
Construccion de proyectos con gradle
PDF
Java 8 Stream API. A different way to process collections.
PDF
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
PDF
Measuring Code Quality in WTF/min.
PDF
Spring4 whats up doc?
PDF
Gradle como alternativa a maven
PDF
El poder del creador de Software. Entre la ingeniería y la artesanía
PDF
Geo-SentimentZ
PDF
HDTR images with Photoshop Javascript Scripting
Leverage CompletableFutures to handle async queries. DevNexus 2022
Building Modular monliths that could scale to microservices (only if they nee...
Building modular monoliths that could scale to microservices (only if they ne...
Leveraging Completable Futures to handle your query results Asynchrhonously
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
Cdm mil-18 - hypermedia ap is for headless platforms and data integration
What's in a community like Liferay's
Java9 Beyond Modularity - Java 9 más allá de la modularidad
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
Managing user's data with Spring Session
Parallel streams in java 8
Construccion de proyectos con gradle
Java 8 Stream API. A different way to process collections.
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Measuring Code Quality in WTF/min.
Spring4 whats up doc?
Gradle como alternativa a maven
El poder del creador de Software. Entre la ingeniería y la artesanía
Geo-SentimentZ
HDTR images with Photoshop Javascript Scripting
Publicidad

Último (20)

PPTX
Propuesta BKP servidores con Acronis1.pptx
PPTX
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
PPTX
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PDF
Maste clas de estructura metálica y arquitectura
PPTX
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PDF
Estrategia de apoyo tecnología miguel angel solis
PDF
Liceo departamental MICRO BIT (1) 2.pdfbbbnn
PDF
clase auditoria informatica 2025.........
PDF
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
PDF
Calidad desde el Docente y la mejora continua .pdf
PDF
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
PPTX
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
PPTX
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
PPTX
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
PPT
El-Gobierno-Electrónico-En-El-Estado-Bolivia
PPTX
Presentación PASANTIAS AuditorioOO..pptx
PDF
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PDF
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
PPTX
historia_web de la creacion de un navegador_presentacion.pptx
Propuesta BKP servidores con Acronis1.pptx
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Maste clas de estructura metálica y arquitectura
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Estrategia de apoyo tecnología miguel angel solis
Liceo departamental MICRO BIT (1) 2.pdfbbbnn
clase auditoria informatica 2025.........
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
Calidad desde el Docente y la mejora continua .pdf
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
El-Gobierno-Electrónico-En-El-Estado-Bolivia
Presentación PASANTIAS AuditorioOO..pptx
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
Zarate Quispe Alex aldayir aplicaciones de internet .docx
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
historia_web de la creacion de un navegador_presentacion.pptx

A real systemwithjms-rest-protobuf-mongodb

  • 1. Integrando Sistemas reales con REST, JMS, Protobuf y MongoDB Andrés Perez Indra David Gómez Extrema Sistemas lunes 26 de marzo de 12
  • 2. David G ómez iner ect & Tra Sw Archit om ema-sistemas.c dgomez@extr zg @dgome Andrés Pérez y David Gómez 2 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 3. és Pérez Andr itect David G ómez iner Sw Arch ect & Tra Sw Archit om z@indra. es ema-sistemas.c apere dgomez@extr zg @dgome Andrés Pérez y David Gómez 2 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 4. Hablaremos de • El caso real. • La arquitectura propuesta – Interfaz REST entre GUI y Server – Protobuf entre Dispositivos y Server/GUI – JMS para comunicación asíncrona Server -> GUI – MongoDB para persistencia Andrés Pérez y David Gómez 3 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 5. El caso real. Control de tráfico marítimo Andrés Pérez y David Gómez 4 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 6. El caso real. Control de tráfico marítimo Emisor AIX 3-5 min Andrés Pérez y David Gómez 5 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 7. El caso real. Control de tráfico marítimo Emisor AIX 3-5 min Andrés Pérez y David Gómez 6 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 8. El caso real. Control de tráfico marítimo Receptor GPS Radar (3 s) Goniometro Emisor AIX Estación Meteo, 3-5 min Cámaras, ... Andrés Pérez y David Gómez 6 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 9. El Problema: La escalabilidad Andrés Pérez y David Gómez 7 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 10. El Problema: La escalabilidad Por cada barco: Recepción y procesamiento de señales (nº) Transacciones, Cálculo de alarmas Gestión de Históricos Andrés Pérez y David Gómez 8 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 11. El Problema: La escalabilidad Señales (1 AIS x 3 min + 1 radar x 3 seg) x 100 barcos Alarmas Persistencia de Líneas de Varada: (10.000+ ptos x 100+ líneas) 40 Alarmas Zonas, Elementos Navegación Persistencia: Total: 87 tablas + históricos(x2) Andrés Pérez y David Gómez 9 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 12. El problema: la escablabilidad Andrés Pérez y David Gómez 10 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 13. La arquitectura Speaker’s Name 11 Speaker mail – company or community lunes 26 de marzo de 12
  • 14. REST Cameras GUI 1 JMS Server Protobuf JMS Radar REST Spring Data GUI 2 DB Gonio Speaker’s Name 12 Speaker mail – company or community lunes 26 de marzo de 12
  • 15. REST Comunicación síncrona entre GUI y Servidor Speaker’s Name 13 Speaker mail – company or community lunes 26 de marzo de 12
  • 16. ¿Qué es REST? • REpresentational State Transfer • HTTP como protocolo de comunicación – No sólo como transporte • La sesión es responsabilidad del cliente – Escalable Andrés Pérez y David Gómez 14 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 17. ¿Qué es REST? • URIs representan recursos (no acciones) • Acciones indicadas en el método HTTP • Formato especificado en cabeceras HTTP – Accept: – ContentType: • No todas las respuestas contienen datos • Error o Resultado con HTTPStatus Andrés Pérez y David Gómez 15 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 18. Comparación Andrés Pérez y David Gómez 16 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 19. Comparación GET http://server:port/zones/ POST http://server:port/zones/388 GET http://server:port/zones/388 PUT http://server:port/zones/388 Andrés Pérez y David Gómez 16 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 20. Comparación GET http://server:port/zones/ POST http://server:port/zones/388 GET http://server:port/zones/388 PUT http://server:port/zones/388 http://server:port/listZones http://server:port/createNewZone http://server:port/getZone?id=388 http://server:port/updateZone?id=388 Andrés Pérez y David Gómez 16 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 21. (Spring) REST en el servidor Andrés Pérez y David Gómez 17 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 22. (Spring) REST en el servidor <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>3.0.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.0.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>3.0.6.RELEASE</version> </dependency> Andrés Pérez y David Gómez 17 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 23. ¿Por qué REST con Spring? • Simplifica – la gestión de serialización – La gestión de códigos de error – Mapping de URLs a métodos • En cliente tenemos el RestTemplate Andrés Pérez y David Gómez 18 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 24. Un Controlador de Zona (I) Andrés Pérez y David Gómez 19 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 25. Un Controlador de Zona (I) @Controller public  class  ZoneController  {     @Inject   private  ZoneService  service;   //  getZoneList  -­‐>  GET     @RequestMapping(value="/zones",  method=RequestMethod.GET)   public  @ResponseBody  List<Zone>  getZones(){     return  service.findAll();   }   //  newZone  -­‐>  POST   @RequestMapping(value  =  "/zones",  method  =  RequestMethod.POST)   @ResponseStatus(HttpStatus.CREATED)   public  void  newZone(@RequestBody  Zone  z,         HttpServletRequest  request,  HttpServletResponse  response)  {     service.save(z);     response.addHeader("Location",           getLocationForChildResource(request,  order.getId()));   } } Andrés Pérez y David Gómez 19 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 26. Un Controlador de Zona (II) Andrés Pérez y David Gómez 20 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 27. Un Controlador de Zona (II) @Controller public  class  ZoneController  {   //  newZone  -­‐>  POST   @RequestMapping(value  =  "/zones",  method  =  RequestMethod.POST)   @ResponseStatus(HttpStatus.CREATED)   public  void  newZone(@RequestBody  Zone  zone,         HttpServletRequest  request,  HttpServletResponse  response)  {     service.save(zone);     response.addHeader("Location",           getLocationForChildResource(request,  zone.getId()));   }   private  String  getLocationForNewResource(HttpServletRequest  request,  Object  identifier)  {     StringBuffer  url  =  request.getRequestURL();     UriTemplate  template  =  new  UriTemplate(url.append("/{zoneId}").toString());     return  template.expand(identifier).toASCIIString();   } } Andrés Pérez y David Gómez 20 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 28. Un Controlador de Zona (III) Andrés Pérez y David Gómez 21 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 29. Un Controlador de Zona (III) @Controller public  class  ZoneController  {   //  getZone  -­‐>  GET     @RequestMapping(value="/zones/{id}",  method=RequestMethod.GET)   public  @ResponseBody  Zone  getZone(@PathVariable("id")  String  id)  {     return  service.findById(id);   }       //  updateZone  -­‐>  PUT   @RequestMapping(value="/zones/{id}",  method=RequestMethod.PUT)   @ResponseStatus(HttpStatus.NO_CONTENT)   public  void  updateZone(@RequestBody  Zone  z)  {     service.save(z);   }   //  delete  -­‐>  DELETE     @RequestMapping(value="/zones/{id}",  method=RequestMethod.DELETE)   @ResponseStatus(HttpStatus.NO_CONTENT)     public  void  deleteZone(@PathVariable("id")  String  id){     service.removeById(id);   }   } Andrés Pérez y David Gómez 21 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 30. Configuración Andrés Pérez y David Gómez 22 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 31. Configuración <?xml  version="1.0"  encoding="UTF-­‐8"?> <beans  xmlns="http://www.springframework.org/schema/beans">   <context:component-­‐scan  base-­‐package="com.vts.server"/>   <bean  id="xstreamMarshaller"  class="org.springframework.oxm.xstream.XStreamMarshaller"/>   <mvc:annotation-­‐driven/> </beans> Andrés Pérez y David Gómez 22 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 32. RestTemplate • Invocar servicios REST desde los GUI Andrés Pérez y David Gómez 23 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 33. RestTemplate • Invocar servicios REST desde los GUI @Component public  class  RestZoneServiceInvoker  implements  ZoneServiceInvoker  {            /*  "http://"  +  serverHostName  +  "/vts-­‐server/vts/zones"  */   private  String  baseURI;       private  RestTemplate  restTemplate;   @Inject   public  RestZoneServiceInvoker(RestTemplate  restTemplate)  {     this.restTemplate  =  restTemplate;   }     @Override   public  void  createNew(Zone  z)  {     URI  uri  =  restTemplate.postForLocation(baseURI,  z);   } } Andrés Pérez y David Gómez 23 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 34. RestTemplate • RestTemplate implements RestOperations Andrés Pérez y David Gómez 24 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 35. RestTemplate • RestTemplate implements RestOperations public  interface  RestOperations  {   <T>  T  getForObject(String  url,  Class<T>  responseType,   Object...  uriVariables)  throws  RestClientException;   HttpHeaders  headForHeaders(String  url,  Object...  uriVariables)   throws  RestClientException;   URI  postForLocation(String  url,  Object  request,  Object...  uriVariables)   throws  RestClientException;   <T>  T  postForObject(String  url,  Object  request,   Class<T>  responseType,  Map<String,  ?>  uriVariables) void  put(String  url,  Object  request,  Object...  uriVariables)   throws  RestClientException;   void  delete(String  url,  Object...  uriVariables)   throws  RestClientException; ... } Andrés Pérez y David Gómez 24 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 36. Protobuf Comunicación entre dispositivos y servidor/GUI .Net/C++/Java Speaker’s Name 25 Speaker mail – company or community lunes 26 de marzo de 12
  • 37. Protobuf. 2011-05-01. v 2.4.1 Necesidades en la integración de módulos • Soluciones analizadas en la integración de módulos • Funcionamiento de la solución Andrés Pérez y David Gómez 26 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 38. ¿qué necesitamos? • Sencillez • Alto rendimiento • Adaptabilidad • Compatibilidad con las distintas tecnologías de desarrollo – Controladores de dispositivos en C++ – Servidor central y clientes en Java – Otros componentes sw (Servidores de video) en .Net Andrés Pérez y David Gómez 27 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 39. ¿REST? REST, XML (Servidor java <-> Cliente java) • Pros: – Sencillez. Ampliamente extendido – Compatible con las tecnologías propuestas – Adaptabilidad • Contras: – rendimiento insuficiente para dispositivos Andrés Pérez y David Gómez 28 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 40. Protocolos ‘ad hoc’ • Pros: – Adaptabilidad: • Modificaciones en código para cada actualización. • Existen protocolos básados en bytes de especificación, categorias ASTERIX de EUROCONTROL – Rendimiento • Contras – Dificultad, desarrollo de analizadores por tecnología. – Tiempo Andrés Pérez y David Gómez 29 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 41. Protobuf Mecanismos automáticos de serialización de estructuras de datos. • Alto rendimiento, • sencillez, • adaptabilidad (campos optional), • compatible con las tecnologías planteadas Andrés Pérez y David Gómez 30 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 42. ¿Cómo funciona? • Definición de mensajes (estructuras de datos) • Generación de las clases de acceso a las estructuras de datos • Incorporación de las clases generadas al modelo Andrés Pérez y David Gómez 31 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 43. ¿Cómo funciona? • Definición de mensajes (estructuras de datos) • Generación de las clases de acceso a las estructuras de datos • Incorporación de las clases generadas al modelo Andrés Pérez y David Gómez 32 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 44. Definición de Mensajes • Archivos .proto (pares clave/valor) – clave: identificador del campo del mensaje – valor: de tipo • Números • Booleanos • bytes • mensaje anidado – Marcados como opcionales, obligatorios o repetidos Andrés Pérez y David Gómez 33 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 45. Definición de Mensajes • Archivos .proto (pares clave/valor) – clave: identificador del campo del mensaje – valor: de tipo • Números • Booleanos • bytes • mensaje anidado – Marcados como opcionales, obligatorios o repetidos http://code.google.com/intl/es-ES/apis/protocolbuffers/docs/proto.html Andrés Pérez y David Gómez 33 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 46. Fichero .proto Andrés Pérez y David Gómez 34 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 47. Fichero .proto package  Controllers; option  java_package  =  "com.vts.controller"; message  ControllerMessage  {    enum  CommandType  {        INFO  =  0;        CMD_1  =  1;        CMD_2  =  2;        CMD_3  =  3;         CMD_4  =  4;        CMD_N  =  5;    }    enum  ControllerType  {        UNKNOWN  =  0;        CONTROLLER_1  =  1;        CONTROLLER_2  =  2;       CONTROLLER_3=  3;        CONTROLLER_N  =  4;    }    message  CommandValueDouble{        required  CommandType  commandType  =  1;        required  double  commandValue  =  2;    }    message  CommandValueBool{        required  CommandType  commandType  =  1;        required  bool  commandValue  =  2;    }    message  CommandValueString{        required  CommandType  commandType  =  1;        required  string  commandValue  =  2;    }    message  CommandValueInt32{        required  CommandType  commandType  =  1;        required  int32  commandValue  =  2;    }    required  string  idController  =  2;    required  ControllerType  controllerType  =  3;    repeated  CommandValueDouble  commandValueDouble  =  4;    repeated  CommandValueBool  commandValueBool  =  5;    repeated  CommandValueString  commandValueString  =  6;    repeated  CommandValueInt32  commandValueInt32  =  7; Andrés Pérez y David Gómez 34 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 48. Generación de las clases Andrés Pérez y David Gómez 35 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 49. Incorporación de clases a modelos • Posibilidades: – almacenamiento: de/a ficheros, BD, ... – comunicación: sockets. • Nuevos campos no rompen la compatibilidad Andrés Pérez y David Gómez 36 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 50. Serialización a archivo en C++ Andrés Pérez y David Gómez 37 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 51. Serialización a archivo en C++ ControllerMessage  controllerMessage; controllerMessage.set_idController("123456"); controllerMessage.set_controllerType(controllers::ControllerMessage_ControllerType_CONTROLLER_1); controllers::ControllerMessage_CommandValueString*  propiedad  =   controllerMessage.add_CommandValueString(); controllerMessage-­‐>set_commandType(controllers::ControllerMessage_CommandType_CMD_2); controllerMessage-­‐>set_commandValue("VALOR_COMANDO"); fstream  output("fichero.out",  ios::out  |  ios::binary); controllerMessage.SerializeToOstream(&output); Andrés Pérez y David Gómez 37 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 52. Envío por Socket C++ Andrés Pérez y David Gómez 38 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 53. Envío por Socket C++ ControllerMessage  controllerMessage; controllerMessage.set_commandType(controllers::ControllerMessage_CommandType_CMD_2); int  bufLength  =  controllerMessage.ByteSize(); char*  buffer  =  new  char[bufLength]; google::protobuf::io::ArrayOutputStream  arrayOutput(buffer,  bufLength); google::protobuf::io::CodedOutputStream  codedOutput(&arrayOutput); //Enviamos  primero  el  tamaño  del  mensaje  como  varInt32 codedOutput.WriteVarint32(controllerMessage.ByteSize()); //Y  luego  el  mensaje  en  sí controllerMessage.SerializeToCodedStream(&codedOutput); //codedOutput.ByteCount()  nos  dará  el  tamaño  del  búffer  más   //le  varint  que  indica  el  tamaño  del  mensaje iBufSize  =  codedOutput.ByteCount(); socket-­‐>Send(buffer,  iBufSize); Andrés Pérez y David Gómez 38 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 54. .Net Andrés Pérez y David Gómez 39 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 55. .Net //Lectura  desde  stream TcpClient  cliente  =  new  TcpClient("192.168.250.50",  12345); ControllerMessage  newController; NetworkStream  stream  =  client.GetStream(); newPerson  =   Serializer.DeserializeWithLengthPrefix<Person>(stream,  PrefixStyle.Fixed32); <TRATAMIENTO  DE  LOS  CAMPOS> //Escritura  hacia  stream ControllerMessage  controller  =  newControllerMessage  Person  (); controller.IdController  =  “132465”; <ASIGNACION  DE  TODOS  LOS  VALORES  DESEADOS> Serializer.Serialize(client,  controller); Andrés Pérez y David Gómez 39 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 56. Java Andrés Pérez y David Gómez 40 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 57. Java      private  ObjectOutputStream  salida;      private  ObjectInputStream  entrada;      private  ServerSocket  servidor;      private  Socket  conexion;      public  void  readAndWriteMessage()  {        ControllerMessage  controllerMessage  =  null;        servidor  =  new  ServerSocket(  12345,  100  );        conexion  =  servidor.accept();        salida  =  new  ObjectOutputStream(  conexion.getOutputStream()  );              entrada  =  new  ObjectInputStream(  conexion.getInputStream()  );        controllerMessage  =  ControllerMessage.parseDelimitedFrom(entrada);              /*  TRATAMOS  LOS  CAMPOS  OPORTUNOS  */            controllerMessage.writeDelimitedTo(salida);      } Andrés Pérez y David Gómez 40 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 58. JMS Comunicación del Servidor a GUI Speaker’s Name 41 Speaker mail – company or community lunes 26 de marzo de 12
  • 59. El uso • El servidor envía avisos a los puestos: – Creación de zonas – Alarmas – Actualizaciones de posición de barcos • ¿y si pregunto cada cierto tiempo? (Polling) – La escalabilidad se resiente. Andrés Pérez y David Gómez 42 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 60. JMS • JMS es la forma en enviar mensajes en Java Consumer Destination Topic/ Destination Producer Queue Andrés Pérez y David Gómez 43 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 61. JMS • JMS es la forma en enviar mensajes en Java Consumer Destination Topic/ Destination Producer Queue Consumer Andrés Pérez y David Gómez 43 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 62. JMS • JMS es la forma en enviar mensajes en Java Consumer Destination Topic/ Destination Producer Queue Consumer Topic/ Queue Andrés Pérez y David Gómez 44 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 63. JMS • JMS es la forma en enviar mensajes en Java Consumer Destination Topic/ Destination Producer Queue Consumer Consumer Topic/ Queue Andrés Pérez y David Gómez 44 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 64. JMS • JMS es la forma en enviar mensajes en Java Consumer Destination Topic/ Destination Producer Queue Consumer Consumer Topic/ Queue Andrés Pérez y David Gómez 44 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 65. ¿JMS a pelo? • Demasiado código para enviar un mensaje: • Creación de conexiónes, serialización, gestión deerrores, liberación de recursos Andrés Pérez y David Gómez 45 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 66. ¿JMS a pelo? Connection  conn  =  connectionFactory.createConnection(); Session  session  =  conn.createSession(transactional,  ackMode); ObjectMessage  message  =  session.createObjectMessage(myMessageObject); Message  Producer  producer  =  session.createProducer(topicName); producer.send(message); • Demasiado código para enviar un mensaje: • Creación de conexiónes, serialización, gestión deerrores, liberación de recursos Andrés Pérez y David Gómez 45 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 67. JMS con Spring JMSTemplate • Se encarga de: – Obtención de la conexión, – Serialización del mensaje – Envío al tópico/Cola – Gestión de errores • Se apoya en – MessageConverter – DestinationResolver Andrés Pérez y David Gómez 46 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 68. Dependencias Andrés Pérez y David Gómez 47 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 69. Dependencias <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-core</artifactId> <version>5.5.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>3.0.6.RELEASE</version> </dependency> Andrés Pérez y David Gómez 47 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 70. Configuracion Andrés Pérez y David Gómez 48 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 71. Configuracion <?xml  version="1.0"  encoding="UTF-­‐8"?> <beans>   <bean  name="jmsTemplate"  class="org.springframework.jms.core.JmsTemplate">     <property  name="connectionFactory"  ref="jmsConnectionFactory"  />     <property  name="defaultDestinationName"  value="#{globalTopic.topicName}"/>     <property  name="defaultDestination"  ref="globalTopic"/>     <property  name="receiveTimeout"  value="1"  />     <property  name="pubSubDomain"  value="true"/>     <property  name="messageConverter"  ref="jmsMessageConverter"/>   </bean>   <bean  name="jmsMessageConverter"         class="org.springframework.jms.support.converter.MarshallingMessageConverter">     <property  name="marshaller"  ref="xstreamMarshaller"/>     <property  name="unmarshaller"  ref="xstreamMarshaller"/>   </bean>   <bean  name="jmsEventEmitter"  class="com.vts.jms.JmsEventEmitter"/>   </beans> Andrés Pérez y David Gómez 48 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 72. EventEmitter Andrés Pérez y David Gómez 49 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 73. EventEmitter public  class  JmsEventEmitter       implements  CameraEventListener,  TrafficEventListener,  ...  {   private  JmsTemplate  jmsTemplate;   private  List<ResponsibilityArea>  areas  =  new  ArrayList<ResponsibilityArea>();   private  void  sendJmsEvent(Locatable  event)  {     if  (event.getGeoPoint()  ==  null)  {       //events  with  no  location  should  be  sent  to  the  defaultDestination       jmsTemplate.convertAndSend(event);     }  else  {       sendToApplicableAreas(event);     }   }   @Override   public  void  onTrafficEvent(TrafficEvent  event)  {     sendJmsEvent(event);   } } Andrés Pérez y David Gómez 49 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 74. Para recibir en el cliente Andrés Pérez y David Gómez 50 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 75. Para recibir en el cliente <beans>   <bean  id="jmsConnectionFactory"  class="org.apache.activemq.ActiveMQConnectionFactory">     <property  name="brokerURL"   value="tcp://#{systemProperties['jmsHost']?:'localhost'}:61616"/>   </bean>   <jms:listener-­‐container         connection-­‐factory="jmsConnectionFactory"       destination-­‐type="topic"       message-­‐converter="jmsMessageConverter">     <jms:listener  ref="jmsListener"  method="receiveMessage"   destination="globalTopic"/>     <jms:listener  ref="jmsListener"  method="receiveMessage"         destination="#{systemProperties['responsibilityArea']?:'area0'}"/>   </jms:listener-­‐container>   <bean  id="jmsListener"  class="com.vts.jms.JmsAreaListener"/> </beans> Andrés Pérez y David Gómez 50 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 76. Para recibir en el cliente Andrés Pérez y David Gómez 51 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 77. Para recibir en el cliente public  class  JmsAreaListener  {   public  void  receiveMessage(Object  o)  {     if  (o  instanceof  AisTrackPoint)  {       trackPointEventSupport.fire((AisTrackPoint)o);     }  else  if  (o  instanceof  StaticAisMessage)  {       staticAisMessageEventSupport.fire((StaticAisMessage)o);     }     }   }   Andrés Pérez y David Gómez 51 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 78. ¡Cuidado con las conexiones! • JMSTemplate abre y cierra nuevas conexiones por cada envío • Solución: PoolConnectionFactory Andrés Pérez y David Gómez 52 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 79. ¡Cuidado con las conexiones! • JMSTemplate abre y cierra nuevas conexiones por cada envío • Solución: PoolConnectionFactory <bean  id="jmsConnectionFactory"                        class="org.springframework.jms.connection.CachingConnectionFactory">        <property  name="targetConnectionFactory">                <bean  class="org.apache.activemq.ActiveMQConnectionFactory">                        <property  name="brokerURL"        value="tcp://#{systemProperties['jmsHost']?:'localhost'}:61616"/>                </bean>        </property> </bean> Andrés Pérez y David Gómez 52 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 80. MongoDB Speaker’s Name 53 Speaker mail – company or community lunes 26 de marzo de 12
  • 81. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Source: Nathan Hurst’s Blog Andrés Pérez y David Gómez 54 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 82. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Consistency C Source: Nathan Hurst’s Blog Andrés Pérez y David Gómez 54 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 83. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Consistency Availability C A Source: Nathan Hurst’s Blog Andrés Pérez y David Gómez 54 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 84. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Consistency Availability C A P Partition Tolerance Source: Nathan Hurst’s Blog Andrés Pérez y David Gómez 54 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 85. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Consistency Availability C A P Partition Tolerance Source: Nathan Hurst’s Blog Andrés Pérez y David Gómez 54 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 86. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Consistency Availability C A Sólo 2 P Partition Tolerance Source: Nathan Hurst’s Blog Andrés Pérez y David Gómez 54 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 87. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Consistency Availability A Oracle, MySQL, C Sólo 2 P Partition Tolerance Source: Nathan Hurst’s Blog Andrés Pérez y David Gómez 54 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 88. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Consistency Availability A Oracle, MySQL, C M Hyp is, M on er em Sólo 2 go Ta c Re DB ble ac d , D , H heD at Ba B aS se to re , P Partition Tolerance Source: Nathan Hurst’s Blog Andrés Pérez y David Gómez 54 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 89. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Consistency Availability A Oracle, MySQL, C M Hyp is, M Sólo , on er em uc ra, ort 2 aK go Ta c Co nd m Re Ri DB ble ac B, a de d B, D ass ol , D , H heD hD ple C o,V at Ba B am aS se to yn re D RDBMS , Orientadas a documento P Sim orientadas a columna Key-Value Partition Tolerance Source: Nathan Hurst’s Blog Andrés Pérez y David Gómez 54 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 90. Tipos orientadas a Columna orientadas a Documento Key-value orientadas a Grafos Andrés Pérez y David Gómez 55 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 91. ¿Por qué MongoDB? • Orientada a Documentos – heterogéneos – Representados en formato JSON (o BSON) • Almacenados en Colecciones (no tablas) • Un poco de SQL: – queries, índices, Referencias externas • Optimizada para escrituras (cc) Photo by Ampersand Duck - http://www.flickr.com/photos/ampersandduck/4941185476 Andrés Pérez y David Gómez 56 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 92. Documentos JSON Identificados por un _id Heterogeneos: Identificamos el tipo con _class Andrés Pérez y David Gómez 57 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 93. Documentos JSON Identificados por un _id Heterogeneos: Identificamos el tipo con _class { "_id" : "224000999", "_class" : "com.vts.model.Vessel", "flag" : "ALBANIA", "name" : "Sample NOT_AVAILABLE Vessel 224000999", "callsign" : "SV224000999", "toBow" : 25, "toStern" : 5, "toPort" : 5, "toStarboard" : 5, "comments" : "Sample vessel created automatically for test purposes" } Andrés Pérez y David Gómez 57 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 94. Consola JS Andrés Pérez y David Gómez 58 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 95. Consola JS beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > Andrés Pérez y David Gómez 58 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 96. Consola JS beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > use vts switched to db vts > Andrés Pérez y David Gómez 58 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 97. Consola JS beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > use vts switched to db vts > show collections > Event WeatherData system.indexes vessel > Andrés Pérez y David Gómez 58 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 98. Consola JS beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > use vts switched to db vts > show collections > Event WeatherData system.indexes vessel > db.Event.find() > { "_id" : ObjectId("4e0b5b211446446f6be3bb1a"), "_class" : "com.vts.model.events.SystemEvent", "timestamp" : ISODate("2011-06-29T17:04:33.039Z") } { "_id" : ObjectId("4e0b5b3d144676f49946443f"), "_class" : "com.vts.model.events.SystemEvent", "timestamp" : ISODate("2011-06-29T17:05:01.394Z") } > Andrés Pérez y David Gómez 58 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 99. SpringData y MongoDB XML namespace para configurar driver Mongo MongoTemplate Conversión de excepciones automática Conversión Configurable JMX monitoring Andrés Pérez y David Gómez 59 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 100. Importando Spring Data Andrés Pérez y David Gómez 60 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 101. Importando Spring Data <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</ artifactId> <version>2.7.0-rc1</version> </dependency> Andrés Pérez y David Gómez 60 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 102. Importando Spring Data <repository> <id>spring-release</id> <name>Spring Maven Release Repository</name> <dependency> <url>http://repo.springsource.org/libs-release</url> </repository> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</ <dependency> artifactId> <version>2.7.0-rc1</version> <groupId>org.springframework.data</groupId> </dependency> <artifactId>spring-data-mongodb</artifactId> <version>1.0.1.RELEASE</version> </dependency> Andrés Pérez y David Gómez 60 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 103. Configuración. Spring Namespace Andrés Pérez y David Gómez 61 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 104. Configuración. Spring Namespace <?xml  version="1.0"  encoding="UTF-­‐8"?> <beans  xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-­‐instance"     xmlns:mongo="http://www.springframework.org/schema/data/mongo"   xmlns:context="http://www.springframework.org/schema/context"   xsi:schemaLocation="http://www.springframework.org/schema/beans                                            http://www.springframework.org/schema/beans/spring-­‐beans.xsd            http://www.springframework.org/schema/data/mongo            http://www.springframework.org/schema/data/mongo/spring-­‐mongo-­‐1.0.xsd                    http://www.springframework.org/schema/context            http://www.springframework.org/schema/context/spring-­‐context.xsd"> </beans> Andrés Pérez y David Gómez 61 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 105. Configuración. Spring Namespace <?xml  version="1.0"  encoding="UTF-­‐8"?> <beans  xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-­‐instance"     xmlns:mongo="http://www.springframework.org/schema/data/mongo"   xmlns:context="http://www.springframework.org/schema/context"   xsi:schemaLocation="http://www.springframework.org/schema/beans                                            http://www.springframework.org/schema/beans/spring-­‐beans.xsd            http://www.springframework.org/schema/data/mongo            http://www.springframework.org/schema/data/mongo/spring-­‐mongo-­‐1.0.xsd                    http://www.springframework.org/schema/context            http://www.springframework.org/schema/context/spring-­‐context.xsd"> <mongo:db-­‐factory  dbname="vts"/> </beans> Andrés Pérez y David Gómez 61 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 106. Configuración. Spring Namespace <?xml  version="1.0"  encoding="UTF-­‐8"?> <beans  xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-­‐instance"     xmlns:mongo="http://www.springframework.org/schema/data/mongo"   xmlns:context="http://www.springframework.org/schema/context"   xsi:schemaLocation="http://www.springframework.org/schema/beans                                            http://www.springframework.org/schema/beans/spring-­‐beans.xsd            http://www.springframework.org/schema/data/mongo            http://www.springframework.org/schema/data/mongo/spring-­‐mongo-­‐1.0.xsd                    http://www.springframework.org/schema/context            http://www.springframework.org/schema/context/spring-­‐context.xsd"> <mongo:db-­‐factory  dbname="vts"/>   <bean  id="mongoTemplate"  class="org.springframework.data.mongodb.core.MongoTemplate">     <constructor-­‐arg  name="mongoDbFactory"  ref="mongoDbFactory"  />   </bean> </beans> Andrés Pérez y David Gómez 61 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 107. Spring’s MongoTemplate <bean  id="mongoTemplate"  class="org.springframework.data.mongodb.core.MongoTemplate">   <constructor-­‐arg  name="mongoDbFactory"  ref="mongoDbFactory"  /> </bean> Identifica la colección Convierte query a JSON Convierte respuesta (“_class”) Gestiona las conexiones y cursores Convierte las excepciones Andrés Pérez y David Gómez 62 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 108. Consultas RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”; 63 Andrés Pérez y David Gómez Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 109. Consultas RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”; { “flag” : “ALBANIA” } Mongo: 63 Andrés Pérez y David Gómez Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 110. Consultas RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”; { “flag” : “ALBANIA” } Mongo: Mongo DBCollection vessels = db.getCollection("vessel"); DBObject query = new BasicDBObject(); Driver: query.put("flag", "ALBANIA"); DBCursor albanianShips = vessels.find(query); while (albanianShips.hasNext()) { DBObject result = albanianShips.next(); // Create Vessel object from DBObject } 63 Andrés Pérez y David Gómez Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 111. Consultas RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”; { “flag” : “ALBANIA” } Mongo: Spring Query query = new Query(Criteria.where("flag").is("ALBANIA"); Mongo List<Vessel> vessels = mongoTemplate.find(query, Vessel.class); Template: 63 Andrés Pérez y David Gómez Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 112. Consultas RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”; { “flag” : “ALBANIA” } Mongo: Utilizado para Identificación de la colección Serialización JSON Spring Query query = new Query(Criteria.where("flag").is("ALBANIA"); Mongo List<Vessel> vessels = mongoTemplate.find(query, Vessel.class); Template: 63 Andrés Pérez y David Gómez Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 113. Consultas complejas RDBMS: Andrés Pérez y David Gómez 64 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 114. Consultas complejas SELECT * FROM VESSELS WHERE length < 90 AND length > 30 RDBMS: ORDER BY lastUpdate; Mongo: Andrés Pérez y David Gómez 64 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 115. Consultas complejas SELECT * FROM VESSELS WHERE length < 90 AND length > 30 RDBMS: ORDER BY lastUpdate; Mongo: { “length” : { $lt : 90, $gt : 30} } Mongo Driver: Andrés Pérez y David Gómez 64 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 116. Consultas complejas SELECT * FROM VESSELS WHERE length < 90 AND length > 30 RDBMS: ORDER BY lastUpdate; Mongo: { “length” : { $lt : 90, $gt : 30} } Mongo DBObject query = new BasicDBObject(); DBObject condition = new BasicDBObject("$lt",90); Driver: condition.put("$gt",30); query.put("length", condition); DBObject [] flags = { new BasicDBObject("flag", "ALBANIA"), new BasicDBObject("flag", "SAN MARINO") }; query.put("$or", flags); vessels.find(query); Andrés Pérez y David Gómez 64 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 117. Consultas complejas SELECT * FROM VESSELS WHERE length < 90 AND length > 30 RDBMS: ORDER BY lastUpdate; Mongo: { “length” : { $lt : 90, $gt : 30} } Andrés Pérez y David Gómez 64 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 118. Consultas complejas SELECT * FROM VESSELS WHERE length < 90 AND length > 30 RDBMS: ORDER BY lastUpdate; Mongo: { “length” : { $lt : 90, $gt : 30} } Criteria criteria = Criteria.where("length"); criteria.gte(from); Spring criteria.lte(to); Mongo Query query = new Query(criteria); query.sort().on("lastUpdate", Order.ASCENDING); Template: List<Vessel> vessels = mongoTemplate.find(query, Vessel.class); Andrés Pérez y David Gómez 64 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 119. Inserciones Andrés Pérez y David Gómez 65 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 120. Inserciones public class MongoTemplate implements MongoOperations, ApplicationContextAware { public void save(Object objectToSave) public void save(Object objectToSave, String collectionName) } Andrés Pérez y David Gómez 65 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 121. AbstractRepository Andrés Pérez y David Gómez 66 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 122. AbstractRepository public abstract class AbstractMongoRepository<T> { @Inject protected MongoTemplate mongoTemplate; /** Clase que utiliza Mongo para identificar el nombre de la coleccion */ private Class<T> persistentClass; protected AbstractService(Class<T> persistentClass) { this.persistentClass = persistentClass; } public String determineCollection() { return persistentClass.getSimpleName(); } } Andrés Pérez y David Gómez 66 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 123. AbstractRepository (II) Andrés Pérez y David Gómez 67 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 124. AbstractRepository (II) public abstract class AbstractMongoRepository<T> { public void save(T e) { mongoTemplate.save(e, determineCollection()); } public void removeById(String id) { Object e = findById(id); if (e != null) { mongoTemplate.remove(e, determineCollection()); } } public T findById(String id) { T t = mongoTemplate.findById(id, persistentClass); if (t == null) { throw new ObjectNotFoundException(persistentClass, id); } return t; } Andrés Pérez y David Gómez } Indra y Extrema Sistemas 67 lunes 26 de marzo de 12
  • 125. VesselRepository Andrés Pérez y David Gómez 68 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 126. VesselRepository public class VesselRepository extends AbstractMongoRepository<Vessel> { public VesselRepository() { super(Vessel.class); } } Andrés Pérez y David Gómez 68 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 127. A tener en cuenta • Cuidado con los campos transient – La serializacion object <-> JSON se hace por reflexión – Registrar un custom Converter • Queries con multiples valores Andrés Pérez y David Gómez 69 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 128. A tener en cuenta • Cuidado con los campos transient – La serializacion object <-> JSON se hace por reflexión – Registrar un custom Converter • Queries con multiples valores Query query = new Query( Criteria .where("length").gte(20) .and("length").lt(60)); Andrés Pérez y David Gómez 69 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 129. A tener en cuenta • Cuidado con los campos transient – La serializacion object <-> JSON se hace por reflexión – Registrar un custom Converter • Queries con multiples valores Andrés Pérez y David Gómez 69 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 130. A tener en cuenta • Cuidado con los campos transient – La serializacion object <-> JSON se hace por reflexión – Registrar un custom Converter • Queries con multiples valores Query query = new Query( Criteria .where("length").gte(20).lte(60)); Andrés Pérez y David Gómez 69 Indra y Extrema Sistemas lunes 26 de marzo de 12
  • 131. Q&A Speaker’s Name 70 Speaker mail – company or community lunes 26 de marzo de 12