34
Concretorías y Sistemas FLEX / JEE José Luis Coronel Cortes Arquitecto Tecnológico BEE Concretorías y Sistemas

JUG DAY FLEX / JEE

Embed Size (px)

DESCRIPTION

Presentacion de JEE / FLEX para el JUG DAY.

Citation preview

Page 1: JUG DAY FLEX / JEE

Concretoríasy Sistemas

FLEX / JEEJosé Luis Coronel CortesArquitecto Tecnológico

BEE Concretorías y Sistemas

Page 2: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Introducción Flex Data Services BlazeDS Flex – BlazeDS Objetos Remotos

• Request (AMF)• ResultEvent / ResultFault• Remoting-config.xml

Servicio de Mensajeria• Adaptadores• Destination• Producer / Consumer• Subtopic• message-config.xml• Selector• JMS

AgendaAgenda

Page 3: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Presentador: Soy José Luis Coronel Cortés Ingeniero de la Universidad Tecnológica Metropolitana (UTEM), con 4 años de experiencia en Java.

Empresa: Me desempeño como Arquitecto Tecnológico de la empresa BEE, creadora de productos de software para la industria financiera con más de 20 años de presencia en Chile, Argentina, Perú y México.

Objetivo: Mi interés es mostrar a partir de mi propia experiencia y conocimiento, los beneficios de la herramienta Flex® integrada a JEE. Después de esta presentación los asistentes conocerán cuales son los principales beneficios de BlazeDS, el cual es un “Data Source” Open Source desarrollado por Adobe.

IntroducciónIntroducción

Page 4: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Desarrollo de aplicaciones RIA (Rich Internet Applications)

Programación en AS3 (Action Script 3) y MXML (Multimedia eXtensible Markup Language).

Soporte para E4X (ECMAScript for XML).

Orientado a la “Usabilidad”.

Open Source (SDK) bajo licencia MPL (Mozilla Public License).

FLEXFLEX

Page 5: JUG DAY FLEX / JEE

Concretoríasy Sistemas

BlazeDS

LiveCycle Data Services (LCDS)

RED5

GraniteDS

WebORB

Data ServicesData Services

Page 6: JUG DAY FLEX / JEE

Concretoríasy SistemasFlex - BlazeDSFlex - BlazeDS

Flash PlayerAIR

Servidor JEE

Flex BlazeDS

Servicios WEB

Servicios HTTP

Objetos Remotos

Servicio Mensajería

Servicios WEB

Servicios HTTP

Objetos Remotos

Servicio Mensajería

Page 7: JUG DAY FLEX / JEE

Concretoríasy SistemasFlex - BlazeDSFlex - BlazeDS

web.xml MessageBroker

Servlet

services-config.xml

messaging-config.xml

proxy-config.xml

remoting-config.xml

Factoria

Page 8: JUG DAY FLEX / JEE

Concretoríasy SistemasFlex - BlazeDSFlex - BlazeDS

BlazeDS Servicio

Factoria

Spring DAO

Hibernate

Ibatis

Page 9: JUG DAY FLEX / JEE

Concretoríasy SistemasObjetos RemotosObjetos Remotos

Llamadas remotas (RPC) a objetos Java.

Protocolo AMF3 (binario, basado en SOAP, sobre HTTP).

Serialización / Deserialización transparente para el desarrollador.

La respuesta en Flex se atrapa con un ResultEvent para el caso de éxito y un FaultEvent en caso de error

Cliente Servidor

RemoteObject

Java

Request (AMF)

ResultEvent / FaultEvent

Page 10: JUG DAY FLEX / JEE

Concretoríasy SistemasObjetos RemotosObjetos Remotos

Cliente Servidor

remoting-config.xml

Request

ResultEvent

RemoteObject

Button

DataGrid

Handler

ProductoServicio

ProductoDAO

Page 11: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Objetos RemotosObjetos RemotosJavaJava

public class ProductoServicio{

public Producto getProductoPorId(int productoId) throws Exception{ return productoDao.getProductoPorId(productoId); }

public List getListadoProductos(){ return productoDao.getListadoProductos(); }

} Servidor

ProductoServicio

ProductoDAO

Page 12: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Objetos Remotos Objetos Remotos remoting-config.xmlremoting-config.xml

<destination id=“productoServicio”> <properties> <source>cl.jug.ProductoServicio</source> <scope>application</scope> </properties></destination>

Servidor

ProductoServicio

ProductoDAO

remoting-config.xml

Page 13: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Objetos Remotos Objetos Remotos MXML / ActionScriptMXML / ActionScript

ClienteRemoteObject

<mx:RemoteObject id="miServicio” destination=“productoServicio” result="resultadoHandler(event)” fault=“errorHandler(event)"/>

import mx.rpc.remoting.RemoteObject;

var miServicio : RemoteObject = new RemoteObject();miServicio.destination = “productoServicio";miServicio.addEventListener("result", resultadoHandler);miServicio.addEventListener("fault", errorHandler);

Page 14: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Objetos Remotos Objetos Remotos ButtonButton

<mx:Button label=“Listado Productos” click="miServicio.getListadoProductos()"/>

<mx:Button label=“Producto por Id” click=“miServicio.getProductoPorId(32)"/>

Cliente

RemoteObject

Button

Page 15: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Objetos Remotos Objetos Remotos DataGridDataGrid

<mx:DataGrid dataProvider="{miServicio.getListadoProductos.lastResult}"/>

Page 16: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Objetos Remotos Objetos Remotos HandlerHandler

[Bindable]private var productos : ArrayCollection;

private function resultadoHandler(evento : ResultEvent) : void { productos = evento.result as ArrayCollection;}

Page 17: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Objetos Remotos Objetos Remotos Métodos en el RemoteObjectMétodos en el RemoteObject

<mx:RemoteObject id="miServicio” destination=“productoServicio” fault="faultHandler(event)“> <mx:method name="getListadoProductos” result=“listadoHandler(event)"/>

<mx:method name="getProductoPorID” result=“productoHandler(event)"/>

</mx:RemoteObject>

Page 18: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Objetos Remotos Objetos Remotos AS3 / JavaAS3 / Java

package{

[RemoteClass(alias=“cl.jug.Producto")] public class Producto {

public var productoId : int; public var nombre : String; public var precio : int;

}}

ResultEvent : La respuesta se guarda en un objeto de tipo Producto

var producto : Producto = Producto(evento.result);

Page 19: JUG DAY FLEX / JEE

Concretoríasy SistemasServicio de MensajeríaServicio de Mensajería

Núcleo principal de BlazeDS.

“Push” de datos a los clientes conectados.

Creación de aplicaciones colaborativas.

En el cliente se define un consumidor ”<mx:Consumer>” y un productor “<mx:Producer>” de mensajes.

El lugar donde consumir y enviar los mensajes se encontrara definido por el atributo “destination” asociado al archivo de configuración de los servicios de mensajería.

Data DataChannel

Channel

Destination

Page 20: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Servicio de MensajeríaServicio de MensajeríaAdaptadoresAdaptadores

Los adaptadores en la mensajería determinan que aplicaciones cliente participan en la esta.

Existen dos tipos :

• Actionscript : Para aplicaciones en las que solo intervienen clientes Flex. (es el usado por defecto).

• JMS : Permite usar clientes Flex y JMS.

Page 21: JUG DAY FLEX / JEE

Concretoríasy SistemasServicio de MensajeríaServicio de Mensajería

Cliente Servidor

Producer

Consumer

Button

Handler

messaging-config.xml

Page 22: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Servicio de MensajeríaServicio de MensajeríaDestinationDestination

Servidor

Messaging-

config.xml

<destination id=“clientes”> <channels> <channel ref=“my-polling-amf”/> </channels></destination>

<destination id=“destinoStream”> <channels> <channel ref=“my-streaming-amf”/> </channels></destination>

Page 23: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Servicio de MensajeríaServicio de MensajeríaProducerProducer

Cliente

Producer

<mx:Producer id=“productor” destination=“clientes"/>

Page 24: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Servicio de MensajeríaServicio de MensajeríaProducerProducer

import mx.messaging.messages.AsyncMessage;

var mensaje : AsyncMessage = new AsyncMessage();mensaje.headers.user = “usuario”;mensaje.body = “Mensaje a enviar”;productor.send(mensaje);

Cliente

Producer

Button

Page 25: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Servicio de MensajeríaServicio de MensajeríaConsumerConsumer

Destination

<mx:Consumer id=“consumidor” destination=“clientes“ message="mensajeHandler(event)” />

Subscribeconsumidor.subscribe();

Cliente

Producer

ButtonConsume

r

Page 26: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Servicio de MensajeríaServicio de MensajeríaHandlerHandler

Cliente

Producer

Button

Consumer

Handler

import mx.controls.Alert;

private function mensajeHandler(evento : MessageEvent) : void { Alert.show(evento.message.body as String, “Mensaje recibido desde el usuario : " + evento.message.headers.user);}

Page 27: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Servicio de MensajeríaServicio de MensajeríaSubtopicSubtopic

Cliente 1

Cliente2

Componente A

Componente B

Componente A

Componente B

Servidor

Topic

Subtopic_A

Subtopic_B

Page 28: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Servicio de MensajeríaServicio de MensajeríaSubtopicSubtopic

private function iniciarAplicacion() : void{ consumidor.subtopic = “chat.cliente1“; consumidor.subscribe();}

private function enviarMensaje(texto : String) : void{ var mensaje : IMessage = new AsyncMessage(); mensaje.headers = new Array(); mensaje.body.mensajeChat = texto; producidor.subtopic = "chat.cliente1“; producidor.send(mensaje);}

Page 29: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Servicio de MensajeríaServicio de MensajeríaSubtopic – message-config.xmlSubtopic – message-config.xml

<destination id="chat“> <properties> <network> <session-timeout>0</session-timeout> </network> <server> <max-cache-size>1000</max-cache-size> <message-time-to-live>0</message-time-to-live> <durable>false</durable> <allow-subtopics>true</allow-subtopics> <subtopic-separator>.</subtopic-separator> </server> </properties></destination>

Page 30: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Servicio de MensajeríaServicio de MensajeríaSelectorSelector

private function iniciarAplicacion() : void{ consumidor.selector = "propiedad1> 30“; consumidor.subscribe();}

private function enviarMensaje(valor : int, texto : String) : void{ var mensaje:IMessage = new AsyncMessage(); mensaje.headers = new Array(); mensaje.headers["propiedad1"] = valor; mensaje.body.mensajeChat= texto; productor.send(mensaje);}

Page 31: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Servicio de MensajeríaServicio de MensajeríaJava - HeaderJava - Header

AsyncMessage mensaje = new AsyncMessage();mensaje.setDestination(“chat");mensaje.setClientId(clienteId);mensaje.setMessageId(UUIDUtils.createUUID(false));mensaje.setTimestamp(System.currentTimeMillis());mensaje.setBody(“Hola Mundo!!”);Map map = new HashMap();map.put("propiedad1", "5");mensaje.setHeaders(map);mensajeBroker.routeMessageToService(mensaje, null);

Page 32: JUG DAY FLEX / JEE

Concretoríasy Sistemas

Servicio de MensajeríaServicio de MensajeríaJMS – message-config.xmlJMS – message-config.xml

<destination id=“chat-topic-jms“> <properties> <server> <durable>false</durable> <durable-store-manager>flex.messaging.durability.FileStoreManager</durable-store-manager> </server> <jms> <destination-type>Topic</destination-type> <message-type>javax.jms.ObjectMessage</message-type> <connection-factory>jms/flex/TopicConnectionFactory</connection-factory> <destination-jndi-name>jms/topic/flex/FlexChatTopic</destination-jndi-name> <delivery-mode>NON_PERSISTENT</delivery-mode> <message-priority>DEFAULT_PRIORITY</message-priority> <acknowledge-mode>AUTO_ACKNOWLEDGE</acknowledge-mode> <transacted-sessions>false</transacted-sessions> </jms> </properties> <channels> <channel ref="my-polling-amf"/> </channels> <adapter ref="jms"/></destination>

Page 33: JUG DAY FLEX / JEE

Concretoríasy Sistemas

DEMOSTRACION

Page 34: JUG DAY FLEX / JEE

Concretoríasy Sistemas

¿PREGUNTAS?