Upload
jcoronel
View
2.024
Download
0
Tags:
Embed Size (px)
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?