Une introduction à la technologie EJB (2/3)



Documents pareils
Synchro et Threads Java TM

Un ordonnanceur stupide

Introduction : les processus. Introduction : les threads. Plan

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

Threads. Threads. USTL routier 1

JOnAS Day 5.1. Clustering

Java Naming and Directory Interface

1. Installation d'un serveur d'application JBoss:

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Développement Logiciel

Programmation Par Objets

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Problèmes liés à la concurrence

INITIATION AU LANGAGE JAVA

Création d une application JEE

Dis papa, c est quoi un bus logiciel réparti?

Création d un service web avec NetBeans 5.5 et SJAS 9

Auto-évaluation Programmation en Java

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Notion de thread (1/2)

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Présentation du cours. Sécurité dans Java EE. Plan (1/2) Plan (2/2) Généralités sur la sécurité

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Composants logiciels Exemples : Java Beans, Enterprise Java Beans

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

OpenPaaS Le réseau social d'entreprise

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

2 Chapitre 1 Introduction

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

Construire une application marketing Facebook sur la plateforme Windows Azure

Modèle à composants. Daniel Hagimont. IRIT/ENSEEIHT 2 rue Charles Camichel - BP TOULOUSE CEDEX 7. Remerciements

Programmation MacOSX / ios

Calcul Parallèle. Cours 5 - JAVA RMI

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Création d objet imbriqué sous PowerShell.

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

Remote Method Invocation Les classes implémentant Serializable

Application web de gestion de comptes en banques

Premiers Pas en Programmation Objet : les Classes et les Objets

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Applet pour visualiser les variables «automate» notifiées

A DESTINATION DES SERVICES TIERS. Editeurs d applications et ressources pédagogiques connectées à l ENT

TP Programmation Java / JDBC / Oracle

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

Projet de programmation (IK3) : TP n 1 Correction

Tutoriel d installation de Hibernate avec Eclipse

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

EXA1415 : Annotations

Alfstore workflow framework Spécification technique

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

Remote Method Invocation (RMI)

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

Connexion à SQL Server 2005 à partir du serveur d application SJSAS 9 Utilisation d une interface JDBC

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Corrigés des premiers exercices sur les classes

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

Programmer en JAVA. par Tama

La base de données XML exist. A. Belaïd

Architecture Orientée Service, JSON et API REST

Introduction à la programmation concurrente

Introduction au langage Java

Web Tier : déploiement de servlets

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

21 mars Simulations et Méthodes de Monte Carlo. DADI Charles-Abner. Objectifs et intérêt de ce T.E.R. Générer l'aléatoire.

LOG4430 : Architecture logicielle et conception avancée

LOG4430 : Architecture et conception avancée

Accès aux bases de données

Environnements de développement (intégrés)

Desktop Intégration. Rémi Forax

.NET - Classe de Log

Gestion distribuée (par sockets) de banque en Java

Cloud. Définition? 08/11/2012. James Urquhart The Wisdom of Clouds

Corrigé des exercices sur les références

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Documentation CAS à destination des éditeurs

Bases Java - Eclipse / Netbeans

Composants Logiciels. Le modèle de composant de CORBA. Plan

La gestion des exceptions

Programmation d Applications Concurrentes et Distribuées (INF431)

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Le MSMQ. Version 1.0. Pierre-Franck Chauvet

WEBSERVICES. Michael Fortier. Master Informatique 2ème année. A308, Université de Paris 13

Première coupe : Introduction à la plateforme Java EE JAVA JAVA. Introduction à la plateforme Java EE. Introduction à la plateforme Java EE

Cours de Systèmes d Exploitation

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Développement d un réseau social modulaire

7 Développement d une application de MapReduce

Package Java.util Classe générique

Java et les annotations

Transcription:

Une introduction à la technologie EJB (2/3) 1 Les singletons des EJB 3.1 1.1 Synchronisation gérée manuellement Depuis la version 3.1, des EJB Statless à instance unique sont maintenant disponibles : ce sont des singletons. En voila un exemple : package services; import java.util.hashmap; import java.util.map; import javax.annotation.postconstruct; import javax.ejb.concurrencymanagement; import javax.ejb.concurrencymanagementtype; import javax.ejb.singleton; @Singleton(name = "storage") @Startup() @ConcurrencyManagement(ConcurrencyManagementType.BEAN) public class Storage { final Map<String, String> storage; public Storage() { storage = new HashMap<String, String>(); @PostConstruct public void init() { System.out.println("Storage running..."); /* Récupérer une valeur */ public String get(string key) { return storage.get(key); /* Déposer une valeur */ public void set(string key, String value) { storage.put(key, value); Ces nouveaux composants posent un problème de synchronisation car tous les clients vont utiliser la même instance. Dans notre exemple, l instance de HaspMap ne doit pas être utilisée de manière simultanée par plusieurs Threads. Utilisez OpenEJB (disponible ici 1 ) pour implanter cet EJB. Commencez par utiliser la clause synchronized pour régler ce problème. Tester cette implantation en réalisant une classe de test qui appelle votre EJB dans plusieurs threads. Vous pouvez vous inspirer de l exemple ci-dessous : 1. ress-ejb 1

@Test(timeout = 7000) public void testreadaccess() throws Exception { Runnable execution = new Runnable() { public void run() { monbean.mamethode(); ; Thread t1 = new Thread(execution); Thread t2 = new Thread(execution); Thread t3 = new Thread(execution); Thread t4 = new Thread(execution); t1.start(); t2.start(); t3.start(); t4.start(); t1.join(); t2.join(); t3.join(); t4.join(); Prévoyez de ralentir les méthodes get et set en utilisant la méthode sleep ci-dessous : private void sleep(int ms) { try { Thread.sleep(ms); catch (InterruptedException e) { 1.2 Synchronisation gérée par le conteneur Dans cette dernière version la synchronisation est trop forte car nous aurions pu traiter plusieurs appels simultanés à get. Pour ce faire nous allons enlever les clauses synchronized, changer l annotation ConcurrencyManagement pour indiquer que la synchronisatyion sera géree par le conteneur : @ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) et ajouter des annotations de synchronisation offertes par les EJB 3.1 (javax.ejb.lock 2 ). Nos méthodes deviennent : /* Récupérer une valeur (utilisations simultanées) */ @Lock(LockType.READ) public String get(string key) {... /* Déposer une valeur (utilisation exclusive) */ @Lock(LockType.WRITE) public void set(string key, String value) {... 2. http ://docs.oracle.com/javaee/6/api/?javax/ejb/lock.html 2

Testez cette version en lançant plusieurs threads qui utilisent la méthode get. Utilisez l attribut timeout de l annotation @Test pour tester l exécution en parallèle des threads. Continuez en utilisant cette fois la méthode set. Terminez en créant un test qui mélange threads de lecture et threads d écriture. Comment s opère la synchronisation? 1.3 Lancement et dépendances Vous pouvez ajouter à votre classe l annotation javax.ejb.startup 3 : @Startup Pour forcer la création de ce singleton (sans appel d un éventuel client). Nous pouvons aussi organiser la création des singletons en utilisant l annotation javax.ejb.dependson 4 : @DependsOn("unAutreSingleton") qui indique qu un autre singleton doit être créé avant celui qui contient l annotation. Exercice : créer un singleton qui offre un service très simple et utilisez l annotation précédente pour forcer sa création avant celle de la classe Storage. 2 Les appels asynchrones Afin d éviter que des clients ne soient bloqués en attendant la fin d un appel à un EJB, nous pouvons maintenant, grace à l annotation javax.ejb.asynchronous 5, indiquer qu une méthode ou toutes les méthodes d un EJB doivent être de manière asynchrone : 3. http ://docs.oracle.com/javaee/6/api/?javax/ejb/startup.html 4. http ://docs.oracle.com/javaee/6/api/?javax/ejb/dependson.html 5. http ://docs.oracle.com/javaee/6/api/?javax/ejb/asynchronous.html 3

package services; import java.util.concurrent.future; import javax.annotation.postconstruct; import javax.annotation.resource; import javax.ejb.asyncresult; import javax.ejb.asynchronous; import javax.ejb.sessioncontext; import javax.ejb.stateless; @Stateless public class LongWorks { @PostConstruct public void prepare() { System.out.println("Preparation de " + this); @Asynchronous public void alongwork() { for (int i = 0; (i < 10); i++) { sleep(1000); private void sleep(int ms) { try { Thread.sleep(ms); catch (InterruptedException e) { Exercice : Créez un test unitaire afin d appeler la méthode alongwork. Vérifiez avec timeout que cet appel ne bloque pas le client. 2.1 Appels asynchrones avec résultats L exemple précédent est très simple car la méthode ne renvoie aucun résultat. Dans le cas contraire, nous allons utiliser l interface java.util.concurrent.future 6 pour transmettre le résultat et permettre au client de questionner l état d avancement de l appel asynchrone : @Asynchronous public Future<String> alongworkwithresult(string value) { sleep(5000); return new AsyncResult<String>(value); Exercice 1 : Utilisez la méthode get de l interface Future pour récupérer, chez le client, le résultat de plusieurs appels à la méthode alongworkwithresult. Exercice 2 : Testez, par attente active, la fin de l appel (méthode isdone de l interface Future ), puis récupérez le résultat (méthode get ). 6. http ://docs.oracle.com/javase/6/docs/api/?java/util/concurrent/future.html 4

2.2 Contrôler un appel asynchrone Un client est également capable de demander l arrêt d un traitement asynchrone (méthode cancel de l interface java.util.concurrent.future 7 ). La méthode métier va devoir, périodiquement, tester cette demande comme le montre l exemple ci-dessous : @Resource private SessionContext context; @Asynchronous public Future<String> alongbreakableworkwithresult(string value) { for (int i = 0; (i < 10); i++) { sleep(500); if (context.wascancelcalled()) { return null; return new AsyncResult<String>(value); Exercice 1 : Prévoyez un test unitaire qui va lancer un traitement asynchrone, attendre (un peu) son déroulement et finalement demander son interruption. Exercice 2 : Explorez les capacités de la classe javax.ejb.sessioncontext 8. 3 Sécuriser les accès aux EJB Il est possible de limiter l accès aux méthodes d un EJB à des utilisateurs qui auraient certains profils. En voici un exemple (librement inspiré des exemples présents sur le site d OpenEJB 9 ) : 7. http ://docs.oracle.com/javase/6/docs/api/?java/util/concurrent/future.html 8. http ://docs.oracle.com/javaee/6/api/?javax/ejb/sessioncontext.html 9. http://openejb.apache.org/examples-trunk/index.html 5

package services; import java.util.linkedlist; import java.util.list; import java.util.set; import javax.annotation.security.permitall; import javax.annotation.security.rolesallowed; import javax.ejb.stateful; @Stateful public class Names { Set<String> names = new java.util.hashset<>(); @RolesAllowed({ "Employee", "Manager" ) public void addname(string name) throws Exception { names.add(name); @RolesAllowed({ "Manager" ) public void deletename(string name) { names.remove(name); @PermitAll public List<String> getnames() { return new LinkedList<>(names); Exercice 1 : Vérifiez avec un test unitaire que la méthode getnames est accessible. Exercice 2 : Vérifiez que la méthode addname n est pas accessible (utilisez l attribut expected de l annotation org.junit.test 10 ). 3.1 Authentification par un proxy EJB Pour accéder aux méthodes protégées nous devons nous authentifier. La première solution consiste à passer par un EJB public qui va servir de porte d entrée vers les services authentifiés. En voila un exemple : package services; import javax.annotation.security.runas; import javax.ejb.stateless; @Stateless @RunAs("Manager") public class AsManager { public void deletename(names names, String name) { names.deletename(name); Exercice 1 : Vérifiez avec un test unitaire que la méthode deletename de l EJB AsManager est accessible à un client non authentifié. 10. http ://junit.sourceforge.net/javadoc/?org/junit/test.html 6

3.2 Authentification par identifiant et mot de passe La deuxième solution consiste à donner un identifiant et un mot de passe. Commencez par créer les deux fichiers users.properties accessible à partir du CLASSPATH : pierre=mot-de-passe-de-pierre paul=mot-de-passe-de-paul et groups.properties : Manager=pierre Employee=pierre,paul Le code du client va maintenant intégrer la fourniture du couple identifiant/mot de passe : Properties p = new Properties(); p.put(context.initial_context_factory, "org.apache.openejb.core.localinitialcontextfactory"); p.put(context.security_principal, "paul"); p.put(context.security_credentials, "mot-de-passe-de-paul"); Exercice 1 : Testez l accès authentifié aux méthodes. Faites un test pour le profil Employee et un autre pour le profil Manager. Exercice 2 : Dans votre EJB, interrogez l instance de l interface javax.ejb.sessioncontext 11 pour connaitre l utilisateur authentifié et testez son profil (méthode iscallerinrole ) ; 3.3 Authentification par programmation Testez le troisième exemple 12 d openejb pour mettre en place une authentification définie par programmation (API JAAS 13 ). 11. http ://docs.oracle.com/javaee/6/api/?javax/ejb/sessioncontext.html 12. http://openejb.apache.org/examples-trunk/testing-security-3/ 13. http://www.oracle.com/technetwork/java/javase/jaas/index.html 7