Mostrando entradas con la etiqueta BlazeDS. Mostrar todas las entradas
Mostrando entradas con la etiqueta BlazeDS. Mostrar todas las entradas

miércoles, 29 de diciembre de 2010

Fechas con un día menos en Flex y Java usando BlazeDS

   Cuando trabajamos con fechas en entornos con Flex y Java debemos tener cuidado de un curioso efecto, al cargar una fecha correcta en Java en Flex puede verse con un día menos.

   Este efecto se debe a como son transferidas las fechas entre un servidor Java y un cliente Flex, para ello se serializa la fecha en UTC, es decir sin información de la zona horaria. La conversión a la hora local se realiza a nivel del protocolo de forma automática, por lo tanto si el servidor no conoce la zona horaria del cliente no podrá transformarla adecuadamente. Dependiendo de la aplicación puede ser deseable almacenar/recuperar los datos en la zona horaria del cliente que los guarda, pero en la mayoría de los casos no lo es.

La solución (tal como se indica en el CookBook de Flex) consiste en forzar que la fecha se intercambie sin la información de la zona horaria. Para ello modificaremos los métodos accesores (getters y setters) de las fechas tanto del objeto java, como en el objeto en actionscript de forma que intercambiemos la fecha como el numero de milisegundos desde 1970 menos la cantidad añadida por la zona horaria (para que la trate como en GMT+0). Los objetos quedarían  así:
Java
package com.fraguaDigital;
 
import java.io.Serializable;
import java.util.Date;
import java.util.TimeZone;
 
public class MiClase implements Serializable {

    // ... Otros atributos ...
 
 private Date _fecha;
 public Date getFecha() {
  Date newDate = new Date(_fecha.getTime() - TimeZone.getDefault().getOffset(_fecha.getTime()));
  return newDate;
 }
 public void setFecha(Date value) {
  Date newDate = new Date(value.getTime() + TimeZone.getDefault().getOffset(value.getTime()));
  this._fecha = newDate;
 }
}

ActionScript (Flex)
package com.fraguaDigital
{
 [RemoteClass(alias="com.fraguaDigital.MiClase")]
 public class MiClase
 {
     // ... Otros atributos ...
  
  public var _fecha:Date;
  public function set fecha(value:Date):void {
   var newDate:Date = new Date(value.valueOf() - value.timezoneOffset);
   this._fecha = newDate;
  }
  
  public function get fecha():Date {
   var newDate:Date = new Date(_fecha.valueOf() + _fecha.timezoneOffset);
   return newDate;
  }
 }
}

Con esto ya las fechas llegarán correctamente al cliente.

lunes, 3 de mayo de 2010

BlazeDS: NetConnection.Call.Failed

Bueno como ya había comentado antes, durante las últimas semanas, he tenido una "batalla" con BlazeDS, y parece que finalmente a acabado con un resultado algo inesperado, quedando BlazeDS totalmente exonerado.

El problema consiste en la perdida de conexión entre el cliente y el servidor (Java). Tras realizar una llamada a un servicio si esté se demora mucho (o si colocamos un breakpoint) se pierde la conexión con el servidor y tras el timeout se informa al cliente, con un evento NetStatusEvent con el código NetConnection.Call.Failed, el cuál vuelve a realizar la llamada teniendo así varios hilos ejecutando la misma llamada.

He pasado mucho tiempo comprobando los logs (tanto de servidor como de cliente), variando las configuraciones del BlazeDS, depurando el código de BlazeDS, el código de la librería RPC del FLEX SDK (en varias versiones) sin encontrar un motivo aparente del error, ya que realmente el funcionamiento era correcto. En este proceso siempre llegaba al mismo punto que era la serialización del AMF Request, pero realmente la hacía bien, pero en ese punto era cuando perdía la conexíon.

La sorpresa salta cuando probando en otro entorno con un servidor de aplicaciones Tomcat no se reproduce el error, por lo que decidimos revisar el servidor de aplicaciones Jetty que usamos en desarrollo y encontramos que se debe a una actualización del servidor Jetty que hasta al fecha funcionaba correctamente, pero que había sido actualizado.

El problema radica en la versión 6.1.24 de Jetty, el cuál ha modificado la forma en que se tratan los request HTTP (probablemente exista algún bug). No he profundizado en el tema pues las versiones anteriores de Jetty funcionan correctamente y nos hemos pasado a una anterior, pero creo que el problema anda por la clase HttpParser la cual se encarga de leer (parsear) los request.

Saludos.

sábado, 1 de mayo de 2010

Charles (Proxy Depurador Web)

Buenas a tod@s.

Esta semana he tenido una guerra particular con el BlazeDS (de la cuál hablaré en otro momento cuando tenga más tiempo), y en tales circunstancias he encontrado una herramienta que me ha sido bastante útil. Se trata de Charles, una aplicación que sirve de proxy para las peticiones web y que te permite tanto ver los request/response como depurar las peticiones.

Es cierto que para ver las peticiones del BlazeDS tan sólo s necesario activar el login, pero obviamente es menos legible, y ademas Charles te da cierta información acerca de que está sucediendo y porqué.

sábado, 9 de mayo de 2009

Noticias de Spring

Hoy tenemos una ración de noticias sobre Spring:

En primer lugar, tenemos el anuncio de la primera Release Candidate de "Spring BlazeDS Integration", podemos verlo aquí. Parece que el proyecto va por buen camino, ya hace poco hablabamos de la milestone 2. En esta "release candidate", a parte de corregir ciertos bugs, se han añadido ciertas funcionalidades muy interesantes:
  • Configuración basada en anotaciones para los destinos remotos.
  • Añade numerosas opciones para personalizar los hooks para cosas tales como la traducción de excepciones o añadir adaptadores de terceras partes. Todo aquel que haya tenido que lidiar con el BlazeDS sabrá apreciar esto, ya que la serialización/deserialización de algunos objetos Java a Actionscript y viceversa puede dar problemas. Asimismo, el tratamiento de excepciones requería de cierta lógica adicional para crear un MesasgeException que encapsulara la excepción Java. Aún no lo he probado, pero parece que simplificar bastante este proceso.
  • Integración completa con el servicio de mensajes de BlazeDS, incluyendo soporte para AMF, JMS y la interacción con transportes de mensaje de Spring. El servicio de mensajería permite la comunicación entre clientes, sin tener que codificar nada en el servidor, dicho servicio de mensajería se basa en el modelo publisher-subscriber, en el que el "message service" actúa como enrutador para ambos clientes Flex y JMS.
La segunda noticia de hoy es la liberación de "SpringSource Tool Suite" (STS), cumpliendo la promesa de Rod Johnson en el "SpringOne Europe". SpringSource Tool Suite es un IDE desarrollado sobre eclipse para desarrollo de aplicaciones con Spring, provee un completo conjunto de herramientas para facilitar el desarrollo de aplicaciones que se ejecuten sobre la mayoría de servidores de aplicaciones (como Apache Tomcat, IBM WebSphere, Oracle WebLogic, JBoss, SpringSource tc Server y SpringSource dm Server).

De entre todas las características y herramientas que ofrece, la que más me ha llamado la atención es la "orientación a tareas" que le han dado al desarrollo. Incluyendo una interfaz de Mylyn, en la que se muestran tareas, recursos abiertos, etc.

Podemos ver más información y descargar la suite aquí. También podemos ver en el blog de Christian Dupuis el listado de características de STS.

sábado, 4 de abril de 2009

Integración BlazeDS con Spring

Una muy buena noticia, para todos los desarrolladores Flex que usamos BlazeDS para comunicarnos con un servidor Java, Spring esta desarrollado "Spring BlazeDS Integration".

Este proyecto nos simplificará enormemente la vida a la hora de conectar una aplicación Flex a un servidor Java desarrollado con Spring. Simplificará mucho los ficheros de configuración, la cuál la realizaremos creando beans (sintaxis < bean>).

Aún esta en Milestone 2, pero ya se plantea liberala como RC1 (Release Candidate 1). Entre otras cosas permitirá definir el messageBroker, los remote objects, pero sin lugar a dudas el aspecto que más me ha gustado viendo la documentación de referencia es que también incluirá la configuración para Spring Security (anteriormente conocido como Acegi Security). Con lo cuál podremos asegurar de forma simple nuestras aplicaciones Flex.

Podemos ver el anunció en la página oficial de Spring. En dicha página también podemos encontrar este enlace a adobeTV, en el que Christophe Coenraets hace una gran introducción a Spring BlazeDS Integration.

P.D: Spring security nos da funcionalidades de autorización y autentificación para el uso de nuestros servicios, pero eso ya lo explicaremos en otros post.

Saludos.