Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

15nov/093

Flex BlazeDS – Tutorial Application Java Remoting avec BlazeDS Turnkey

Ce tutorial Adobe Flex avec BlazeDS va vous expliquer comment monter votre première application Java en liaison avec une application Flex. On va ici utiliser le service RPC (Remote Procedure Call) de BlazeDS pour la communication. Afin de faciliter l'explication, on va utiliser la version "Turnkey" de BlazeDS qui est directement livrée avec un serveur d'application Tomcat. Si vous n'avez pas encore installé BlazeDS Turnkey, suivez ces instructions:

Flex BlazeDS – Configurer son environnement BlazeDS avec Turnkey

Création du projet Java

Vous allez avoir besoin d'un projet Java pour la partie serveur de l'application. Tout d'abord, ouvrez Eclipse et créez un nouveau projet Java:

  • Dans le menu d'Eclipse, choisissez File > New > Project
  • Dans l'arbre, choisissez Java Project comme type de projet puis Next
  • Sur la page "Create a Java Project":
    • Entrez "blazeds-server" comme nom de projet
    • Sélectionnez "Create project from existing source", et entrez le chemin vers la webapp "sample" comme par exemple "C:\blazeds\tomcat\webapps\samples\WEB-INF"
    • Next
  • Sur la  page "Java Settings", assurez-vous que le Default output folder soit à "blazeds-server/WEB-INF/classes" puis Finish

Cette configuration de projet vous permet de conserver le code source de vos classes Java dans le dossier WEB-INF/src. Ces classes seront automatiquement compilées dans le dossier WEB-INF/classes.

Création des classes Java

Le service de Remoting (RPC) est un des services inclus dans BlazeDS. Ce service permet au client d'accéder aux méthodes des Plain Old Java Object (POJO = "bon vieux objets Java") sur le serveur.

Dans cet exemple, on va déployer une classe, EchoService.java, sur le serveur qui va renvoyer la String passée par le client. Le code suivant montre la définition de EchoService.java:

package remoting;
public class EchoService
{
    public String echo(String text) {
        return "Server says: I received '" + text + "' from you";
    }
}

Pour créer cette classe, faîtes clic droit sur le projet Java que vous venez de créer puis New > Class. Comme nom de package, entrez "remoting" et comme nom de classe, EchoService:

remoting-1

Vous le voyez, cette classe est très simple. La méthode echo() prend un argument de type String et le retourne avec un texte supplémentaire. Une fois que la classe EchoService.java est compilée, elle sera placée dans WEB-INF/classes/remoting. Notez que les classes Java n'ont pas à importer ou à référencer des ressources BlazeDS.

Création de la destination de remoting (remoting-config.xml)

Une "Remoting Destination" expose une classe Java pour que votre application Adobe Flex puisse l'invoquer de manière distante. La propriété "id" de la destination est le nom logique que votre application Flex utilise pour faire référence à la classe distante, ce qui élimine le besoin d'avoir une référence vers un nom complet de classe Java (fully qualified) codé en dur. Ce nom logique est lié au nom de la classe Java dans le configuration de la destination qui se trouve dans remoting-config.xml.

Pour créer cette Remoting Destination:

  • Dans le projet blazeds-server, ouvrez le fichier remoting-config.xml situé dans le dossier "WEB-INF/flex". Si vous l'ouvrez dans Eclipse, passez en vue "Source" pour avoir le code directement.
  • Plusieurs destinations, fournies avec Turnkey sont déjà présentes. Rajoutez la votre:
<destination id="echoServiceDestination" channels="my-amf">
    <properties>
        <source>remoting.EchoService</source>
    </properties>
</destination>
  • Enregistrez le fichier

L'élément XML "source" référence la classe Java et l'attribut "channels" fait référence au canal qui va être utilisé, ici appelé "my-amf".

13nov/092

Flex BlazeDS – Les fonctionnalités de BlazeDS

BlazeDS consiste principalement en trois services:

  • Le Remoting Service, qui permet aux applications Adobe Flex / Air d'invoquer directement des méthodes d"objets Java déployés sur votre serveur applicatif.
  • Le Messaging Service, qui permet à votre application Adobe Flex de publier des messages et de s'inscrire à des "destinations", permettant le développement d'application temps réel et/ou collaboratives.
  • Le Proxy Service, qui permet aux applications Flex de faire des requêtes vers des services situés sur des domaines différents (cross-domain communication). En d'autres mots, cela permet à votre application Flex d'accéder à des services situés sur des domaines différents de celui sur lequel est hébergé l'application et cela, sans avoir à déployer un fichier cross-domain.xml sur chaque domaine ciblé.

Remoting Service RPC (Remote Procedure Call)

Les services Remote Procedure Call (RPC) ont été crées pour des applications dans lesquelles on cherche à accéder à la donnée grâce à des appels / réponse. Les services RPC laissent le client faire une requête asynchrone au service distant pour va traiter cette requête et renvoyer directement la data au client. Vous pouvez accéder à la donnée grâce ) des composants RPC client comme les services HTTP (GET ou POST), le SOAP (WebService), ou des objets Java (Remote Object Service).

BlazeDS vous permet d'utiliser les composants RemoteObject pour accéder à vos objets Java distants sans les avoir configuré comme des web services.

Un composant client RPC appelle ce web service. Le composant conserve ensuite la réponse (data) du web service dans un objet ActionScript, à partir duquel vous pouvez facilement obtenir la donnée qui vous intéresse. Les composants client RPC sont HTTPService, WebService et RemoteObject.

Vous pouvez utiliser le service de proxy de BlazeDS pour des appels HTTP ou WebService directs mais vous ne pouvez pas utiliser les composants RemoteObject sans BlazeDS ou ColdFusion.

Messaging Service

Le service de messaging permet aux application client de communiquer de manières asynchrone par échange de messages avec le serveur. Un message définit des propriétés telles qu'un identifiant unique, les headers (en-têtes) BlazeDS, des headers personnalisés et le corps du message.

Les applications client qui envoient des messages sont appelées "producers". Vous pouvez définir un "producer" dans une application Flex en utilisant le composant Producer. Les applications qui reçoivent des messages sont appelées "consumers" et peuvent être définit grâce au composant Adobe Flex Consumer. Le composant Consumer s'inscrit à une destination située côté serveur et va recevoir les messages que le Producer envoie vers cette destination.

messageflow

Le Messaging Service supporte aussi la liaison avec JMS (Java Message Service) et utilisant un JMSAdapter ce qui permet aux applications Flex d'échanger avec les applications Java client (en savoir plus sur JMS avec Flex).

12nov/090

Flex BlazeDS – Introduction à BlazeDS

BlazeDS fournit un ensemble de services vous permettant de faire le lien entre votre application côté client et votre donnée (server side) ainsi que le passage de données à de multiples clients tous connectés au même serveur BlazeDS pour une messagerie temps réel entre les clients.

Une application BlazeDS se compose de deux parties: une application cliente et une application Web J2EE côté serveur. Voici un schéma rapide:

blazeds_client_server

L'application client

Une application client BlazeDS est typiquement une application Adobe Flex ou Adobe AIR. Les applications Adobe Flex et AIR utilisent toutes deux les composants Flex pour communiquer avec le serveur BlazeDS, dont les composants RemoteObject, HTTPService, WebService, Producer et Consumer. Ces composants font partie du Flex Software Development Kit (Flex SDK).

Bien que l'on utilise typiquement des applications Flex ou AIR, vous pouvez aussi utiliser une combinaison de Flex, HTML et JavaScript. Ou vous pouvez la développer en HTML et JavaScript en utilisant l'Ajax Client Library.

29oct/093

Flex Modules – Décharger (Unload) correctement ses modules

Le principal intérêt des modules Flex est de découper votre application en plusieurs SWF pouvant être chargés et déchargés à la volée. Le fait de décharger (unload) permet de libérer la mémoire prise par le module une fois qu'il n'est plus utilisé. Cependant, même en faisant un unload() du module, il ne sera pas forcement libéré de la mémoire par le Garbage Collector. En effet, si des références vers ce module existent toujours, le module ne sera pas libéré. Parfois ces références sont évidentes mais parfois elles sont plus difficiles à trouver, surtout quand elles se trouvent au fin fond du framework Flex.

La Flex Team a publié un article pour récapituler les principales cause connues qui font qu'un module n'est pas libéré de la mémoire. Voici le détail.

Chargement de modules dans différents "applicationDomain"

Le fait de charger des modules depuis différents "applicationDomain" peut obliger Flex à référencer des classes dans ses Managers. Ces références peuvent causer la persistence du module en mémoire. Essayez de charger les modules avec l'applicationDomain par défaut (en utilisant les paramètres par défaut de la méthode load().

Fuites mémoire

Les "Memory leaks" peuvent créer des références vers votre module qui vont empêcher le Garbage Collector de libérer le Module Flex de la mémoire. Voici les causes principales:

Styles

Cela se produit même sans tag mx:Style dans votre MXML. Si votre module utilise un composant qui n'est pas utilisé par l'application principale, le module va enregistrer le style par défaut pour ce composant dans le StyleManager et coincer la première instance de votre module. Vous pouvez utiliser l'option du compilateur -compiler.keep-generated-actionscript pour voir quels styles le module et l'application principale utilisent. Vous pouvez aussi utiliser l'option -compiler.keep-all-type-selectors dans l'application principale pour forcer l'application principale à enregistrer les styles par défaut de chaque composant dans le fichier defaults.css. Les CSS chargés à l'exécution (StyleManager.loadStyleDeclarations) ne sont pas concernés par ce problème car ils sont chargés de manière différente.

Resources

Si votre module utilise des composants qui utilisent de ResourceBundles non-utilisés par l'application principale, ces Resource Bundles vont être enregistrés dans le ResourceManager et coincer la première instance du module. Vous pouvez utiliser l'option du compilateur -compiler.keep-generated-actionscript pour voir quels Resource Bundles le module et l'application mère utilisent. Vous pouvez forcer l'application principale à avoir ces Resource Bundles additionnels en ajoutant les metadata du Resource Bundle dans l'application principale.

Par exemple, vous ajouter le Resource Bundle "controls", vous devez ajouter à votre application:[ResourceBundle("controls")]. Si vous chargez vos Resource Bundles comme des modules, assurez-vous que les Resource Module ont bien fini leur chargement avant de charger le module Flex qui utilise le Resource Bundle.

ExternalInterface.addCallback

Les modules ne devraient pas utilier la méthode ExternalInterface.addCallback(). Cela enregistre la méthode dans le navigateur et il n'y a, à ce jour, aucun moyen de la supprimer. Il est recommandé de laisser l'application principale enregistrer une méthode qui va appeler une référence de fonction. Il suffit ensuite de remplacer cette référence par la méthode du module. Quand le module est déchargé, il suffit de mettre cette référence à null.

Timers et autres mécanismes de Timing

L'utilisation de Timer, setTimeout() et setInterval() peuvent causer des fuites mémoire. Les Timer doivent être arrêtés et avoir leurs listeners supprimés. setTimeout et setInterval doivent faire quant à elles appel à clearTimeout() et clearInterval() pour pouvoir être GCed correctement.

Listeners sur évènements depuis des objets à l'extérieur du module

Utilisez des références faibles (weak references) ou assurez vous d'avoir bien supprimé les event listener. Rappelez-vous que lorsque vous appelez A.addEventListener("foo", B.someMethod), "A" a une référence vers B, et pas l'inverse.

Focus

Si un des objets du module a le focus, le FocusManager aura toujours une référence vers le module. Il est conseillé de bouger le focus vers un autre objet à l'extérieur du module avant de le décharger.

RemoteObject

Si un module amène une nouvelle classe qui va faire partie d'une requête serveur, cette classe va être enregistrée par Flash Player et amener une référence vers le module. Liez les Data Classes à l'application principale lorsque c'est possible.

Images chargées

Si un module charge une image, cette image doit être déchargée sinon Flash Player va garder des buffers autour de cette image.

Autres éléments à connaitre

Une fois qu'ils n'y a plus de référence vers les objets d'un module, Flash Player peut encore garder un module en mémoire pendant un moment si certains des objets d'un module on eu le focus. Essayez de taper du texte ou de cliquez dans l'application pour éventuellement libérer des références vers le module.

Les versions Debug d'un module peuvent empêcher le module d'être libéré de la mémoire. Les version de debug contiennent des informations de debug qui peuvent être enregistrées par le debugger. Assurez-vous de tester avec des versions realease des modules et une application lue par un Flash Player classique.