JUG DAY FLEX / JEE

Preview:

DESCRIPTION

Presentacion de JEE / FLEX para el JUG DAY.

Citation preview

Concretoríasy Sistemas

FLEX / JEEJosé Luis Coronel CortesArquitecto Tecnológico

BEE Concretorías y Sistemas

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

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

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

Concretoríasy Sistemas

BlazeDS

LiveCycle Data Services (LCDS)

RED5

GraniteDS

WebORB

Data ServicesData Services

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

Concretoríasy SistemasFlex - BlazeDSFlex - BlazeDS

web.xml MessageBroker

Servlet

services-config.xml

messaging-config.xml

proxy-config.xml

remoting-config.xml

Factoria

Concretoríasy SistemasFlex - BlazeDSFlex - BlazeDS

BlazeDS Servicio

Factoria

Spring DAO

Hibernate

Ibatis

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

Concretoríasy SistemasObjetos RemotosObjetos Remotos

Cliente Servidor

remoting-config.xml

Request

ResultEvent

RemoteObject

Button

DataGrid

Handler

ProductoServicio

ProductoDAO

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

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

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);

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

Concretoríasy Sistemas

Objetos Remotos Objetos Remotos DataGridDataGrid

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

Concretoríasy Sistemas

Objetos Remotos Objetos Remotos HandlerHandler

[Bindable]private var productos : ArrayCollection;

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

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>

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);

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

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.

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

Cliente Servidor

Producer

Consumer

Button

Handler

messaging-config.xml

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>

Concretoríasy Sistemas

Servicio de MensajeríaServicio de MensajeríaProducerProducer

Cliente

Producer

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

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

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

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);}

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

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);}

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>

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);}

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);

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>

Concretoríasy Sistemas

DEMOSTRACION

Concretoríasy Sistemas

¿PREGUNTAS?