EJB3: Session de Beans




                         1
Agenda

 Session de Beans

Déploiement des projets EJB au serveur

Les clients distants pour les Session de
 Beans

Session de beans sans état

L'accès local aux EJB

                                            2
Aperçu



         3
Avantages d’EJB
 Encapsuler la logique
 – La logique métier séparé de contrôle et de présentation
 l'accès à distance
 – Applications multiples sur différents serveurs peuvent accéder EJB
 la simplicité
 – Relativement facile à utiliser par rapport aux autres systèmes à
 distance d'objets
 Large soutien aux fournisseurs
 – JBoss, Oracle AS, WebLogic, WebSphere, Glassfish, etc
 évolutivité
 – Pratiquement tous les app Java EE en charge les serveurs de
 clustering, équilibrage de charge et de basculement
                                                                 4
Désavantages de EJB
 La complexité
   Bien EJB3 pourrait être plus simple que les systèmes RemoteObject autre, à
    distance objet-cadres sont beaucoup plus complexes que locale-objet
    d'approches.
   Le printemps est plus facile et plus puissant pour l'accès local
 Nécessite le serveur Java EE
   Impossible d'exécuter sur Tomcat, Jetty, Resin, JRun, Résine
   Serveurs Java EE sont généralement beaucoup plus difficile à configurer,
    considérablement plus lent à démarrer / redémarrer au cours du
    développement et de test, et coûtent généralement de l'argent
 Nécessite la dernière version de Java EE version
   Doit mettre à niveau vers les derniers communiqués de serveur
 Mauvaise réputation à cause de versions antérieures
   EJB2 était si complexe que les EJB a mauvaise réputation à ce jour


                                                                               5
Utilisation de l'Industrie (Mots-clés dans
Offres d'emploi dans le monde)




                                        6
Session Beans: Aperçu
 session de Beans
   Sur le serveur, vous faites l'interface (marqué avec @ Remote) et
    POJO qu'elle met en œuvre (marqués avec @ Stateless)
      Ordinaires objet Java avec les méthodes ordinaires qui
      utilisent des objets Java ordinaires comme arguments et les
      types de retour
      Aucun Etat (vars exemple) maintenu entre les appels de
      méthode
     Le client utilise InitialContext.lookup ("nom") pour obtenir la
      réf.
 Client effectue des appels de méthode normale (données
 sérialisées sur le net.)
 Session EJB sans état
   Mark POJO avec @ Stateful au lieu de @ Stateless
   Mark méthode spéciale avec @ Remove
   Le client ne similaires appels de recherche et de méthode, mais il
    doit appeler la méthode particulière lorsque vous avez terminé.
      Etat (vars exemple) maintenu jusqu'à ce que cette méthode
       appelée                                                         7
session Beans sans état




                          8
session Beans sans état: Idée
 POJOs
   Ordinaire des classes Java; pas d'interfaces ou des classes
    spéciales parent. Fournissent souvent une sorte de service telles
    que la cartographie des identifications client à des objets à la
    clientèle.
 L'accès local ou à distance
   Peut être consulté soit sur serveur d'application locale (même machine
     que soft qui utilise les beans) ou serveur d'application distant (machine
     différente du soft qui utilise les beans)


 Ne pas maintenir l'état du client
   Les variables d'instance sont protégés contre les conditions de course que
     pendant un seul appel de méthode. Faut pas stocker l'état du client spécifique
     qui doit être accessible à travers des appels de méthodes multiples.

                                                                                      9
session Beans sans état: Approche
• Faire nouvel EJB projet
  – fichier   Nouveau        EJB Project
   • Possibilité de choisir JBoss ou Glassfish comme exécution cible. De toute
  façon, vous pouvez déployer des projets à la fois aux serveurs.
• Définir une interface
  – Marque avec @ Remote
   • Pour accéder à d'autres serveurs ou de projets sur le même serveur
  – Marque avec @ Local
   • Pour ne permettre l'accès de projets sur un même serveur (par défaut)
• Créer une classe qui implémente l'interface
  – Marque avec des apatrides par défaut du serveur JNDI cartographie @
  – Marque AVEC @ Stateless (mappedName = "SomeJndiName")
• Déployer application serveur
  – cliquez R-sur serveur, Ajouter / Supprimer des projets, de démarrer le serveur
                                                                                10
EJB Project
 faire des projets
   fichier           nouveau       EJB Project
   Choisissez un nom
   JBoss ou Glassfish comme cible d'exécution
   Vous pouvez ensuite déployer sur n'importe quel
       serveur compatible; vous n'êtes pas limité à celui
       choisi initialement.
   Facultatif: Ajouter à une EAR
   Si vous faites Projet web dynamique plus tard tard qui
     veut utiliser @ EJB, vous pouvez l'ajouter à la même
     EAR
 Déploiement de projet
   cliquez R-sur JBoss ou Glassfish (ou tout autre serveur Java
    EE 5 que vous avez enregistré avec Eclipse), Ajouter et
    supprimer des projets, choisissez Projet, Ajouter, Terminer
   cliquez R-sur JBoss ou Glassfish (ou autre), Démarrer

                                                                   11
Interface




            12
Classe qui implémente l'interface




                                    13
Les clients de session de
    Beans sans état



                            14
Idée
 Les clients estiment que le bean par JNDI
   Client Java code ne sais même pas la machine sur laquelle réside le
    bean
 Les clients utilisent bean comme un POJO normal
   Mais les arguments et les valeurs de retour sont envoyés à travers le
    réseau
   Ainsi, les classes personnalisées doivent être sérialisables
 Code de base
  InitialContext context = new InitialContext();
  InterfaceName bean = (InterfaceName)context.lookup("JNDI-Name");
jndi.properties
   Fichier texte dans le classpath; donne URL distante et d'autres infos
                                                                  15
Projet client distant
 Fait nouveau projet Web dynamique
   Choisir chanceux numéros-client que le nom
   Choisir que JBoss 5 d'exécution cible
      Peuvent être déployées pour Glassfish ou d'autres serveurs
     Java EE 5
 jndi.properties
   Fichier texte créé, appelé «jndi.properties" dans le dossier src
   Doit donner URL distante. Souvent d'autres infos. Spécifiques du serveur!
   Détails montré dans la diapositive à venir
 Déploiement
   N'a pas besoin de courir sur la même machine que le Projet d'EJB.
   Autonome (bureau) les clients n'ont pas besoin d'être déployé sur n'importe
    quel serveur d'application, ils peuvent simplement avoir une "main" méthode.
   Applications Web devrait être déployée sur un serveur Java EE 5 app

                                                                            16
Distance autonome (bureau) du client




                                       17
Remarque sur le nom de context.lookup
 Numéro
   Vous passez un nom à context.lookup. Si vous utilisez
   simplement @ Remote sans mappedName, le nom par
   défaut est différents pour JBoss que pour Glassfish (ou
   autres serveurs).
   Dans JBoss, le nom JNDI serait
   "NumberServiceBean/remote"
   En Glassfish, le nom JNDI serait
   "coreservlets.bean.NumberService«
 Solution: utiliser mappedName
   J'utilise @ Stateless (mappedName = "NumberCreator")
   au lieu de simplement @ Stateless
   Donc, je peux utiliser le même nom (NumberCreator) quel
   que soit
   dont le serveur du projet EJB est déployé pour            18
Remote Client: jndi.properties




                                 19
Standalone client distant: Résultats
 lucky-numbers (EJB Project)
   Déployé à JBoss ou Glassfish. La sortie est la même
 lucky-nombres-client (Proj Web dynamique.)
   Pas encore déployé sur n'importe quel serveur.
   jndi.properties correspond au serveur d'EJB projet
 sortie




                                                          20
Client Web à distance (Servlet)




                                  21
Client Web à distance(Servlet Suite)




                                       22
Client Web à distance(web.xml)




                                 23
Client Web à distance(Résultats de
JBoss 5)




                                     24
Client Web à distance(Résultats Glassfish
2.1)




                                       25
Utilisation de @ EJB pour
accéder à des beans locaux



                         26
Idée
 Utilisez @ EJB, avant variable d'instance
   Bean sera automatiquement instanciée et assignée. Par exemple:
   @ d'EJB privés Certains services mon service;
 utile pour les
   Un EJB qui utilise un autre d'EJB dans le cadre de sa logique
   Toujours une bonne idée puisque les EJBs sont habituellement
     ensemble
   De multiples applications Web qui utilisent la même logique métier
   Plus simple, mais application Web ne peut pas passer au serveur
     distant
 restrictions
   Avant de variables d'instance, les variables non locales.
   Les deux classes doivent faire partie du même EAR sur le même serveur
   Dans Eclipse, toutes les classes dans un seul projet d'EJB
   satisfaire cette
   Si vous utilisez un projet EJB (EJB) et des projets web
   dynamiques (les classes qui utilisent les EJB), vous devez choisir
   "Ajouter un projet à une EAR» et spécifiez un même
                                                                        27
Exemple: Interface d'EJB




                           28
Exemple: classe EJB qui Implémente
interface




                                     29
Exemple: client distant (Servlet)




                                    30
Exemple: client distant (Servlet Suite)




                                          31
Client à distant: jndi.properties




                                    32
Exemple: Client à distant(web.xml)




                                     33
Exemple: Résultats (JBoss 5)




                               34
Exemple: Résultats (Glassfish 2.1)




                                     35
Sessions Dynamiques de
         Beans



                         36
Sessions Dynamiques de Beans: Idée
 POJOs
   Ordinaire des classes Java; aucune des interfaces spéciales
    ou d'un parent classes. Fournissent souvent une sorte de
    service qui stocke informations (temporairement) ainsi que
    de l'envoyer. Local ou accès à distant
   Peut être consulté soit sur serveur d'application locale
    (même machine comme soft qui utilise les beans) ou serveur
    d'application à distance (différents machine à partir de app
    qui utilise les beans)
 Maintenir l'état du client
   Vous pouvez configurer les beans avec le client-spécifiques
    d'informations, d'accéder ensuite au info (sans crainte de la
    race conditions) jusqu'à ce que vous appelez la méthode
    spéciale marquée avec @ Remove.
                                                               37
Sessions Dynamiques de Beans : Approche

 Faire nouvel EJB projet
   Fichier Nouveau projet EJB
 Définir une interface
     Marque avec @ Remote
   Pour accéder à d'autres serveurs ou de projets sur le même serveur
   Marque avec @ Local
   Pour ne permettre l'accès de projets sur un même serveur (par défaut)
 Créer une classe qui implémente l'interface
   Marque avec @ Dynamique pour serveur JNDI cartographie
   Marque avec @ (Stateful mappedName = "SomeJndiName")
   Marquer une méthode avec @ Retirer
   Lorsqu'elle est appelée, le serveur termine la session et l'instance de
    GC
 Déployer application serveur
   cliquez R-sur serveur, Ajouter / Supprimer des projets, de démarrer le serveur
                                                                                     38
Exemple: Interface d’EJB




                           39
Exemple: Classe EJB qui implémente
l'interface




                                     40
Exemple: Classe EJB qui implémente
l'interface (suite)




                                     41
Exemple: client distant (Servlet)




                                    42
Exemple: client distant (Servlet Suite)




                                          43
Exemple: : client distant (JSP)




                                  44
Exemple: client distant (jndi.properties)




                                       45
Exemple: : client distant (web.xml)




                                      46
Exemple: client distant (formulaire de
saisie)




                                         47
Résultats : client distant (JBoss 5)




                                       48
Résultat: client distant (Glassfish 2.1)




                                           49
Récapitulation




                 50
Livres et références
 EJB 3 en action
   Debu Panda, Reza Rahman, et Derek Lane (Manning)
 Enterprise JavaBeans 3.0 (5e édition)
   Bill Burke et Richard Monson-Haefel (O'Reilly)
 Tutoriel Java EE 5 (EJB section)
   http://java.sun.com/javaee/5/docs/tutorial/doc/bnblr.html
 JBoss EJB3 Tutoriel
   http://docs.jboss.com/ejb3/app-server/tutorial/
 Glassfish EJB FAQ
   https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html
 Cay Horstmann EJB Tutoriel
   http://www.horstmann.com/elvis/elvis-meets-glassfish.html
                                                          51
Résumer
 Session de Beans
   Interface: marque avec @ Remote
   Classe: marque avec @ Stateless (mappedName = "blah")
 Session d’ EJB Dynamique
   Classe Marque avec @ Dynamique lieu de @ Stateless
   Marquer une méthode avec @ Retirer
 session Clients bean
   InitialContext context = new InitialContext ();
  InterfaceType var = (InterfaceType) context.lookup ("blah");
  var.someMethod (args);
   Pour les beans avec état, appelez la méthode spécialement
     marqués lorsque vous avez terminé
   Besoin jndi.properties spécifiques au type de serveur
 L'accès local aux beans
  @EJB private InterfaceType var;
                                                                 52
Questions?




             53

Ejb3 2-session-beans fr

  • 1.
  • 2.
    Agenda  Session deBeans Déploiement des projets EJB au serveur Les clients distants pour les Session de Beans Session de beans sans état L'accès local aux EJB 2
  • 3.
  • 4.
    Avantages d’EJB  Encapsulerla logique – La logique métier séparé de contrôle et de présentation  l'accès à distance – Applications multiples sur différents serveurs peuvent accéder EJB  la simplicité – Relativement facile à utiliser par rapport aux autres systèmes à distance d'objets  Large soutien aux fournisseurs – JBoss, Oracle AS, WebLogic, WebSphere, Glassfish, etc  évolutivité – Pratiquement tous les app Java EE en charge les serveurs de clustering, équilibrage de charge et de basculement 4
  • 5.
    Désavantages de EJB La complexité  Bien EJB3 pourrait être plus simple que les systèmes RemoteObject autre, à distance objet-cadres sont beaucoup plus complexes que locale-objet d'approches.  Le printemps est plus facile et plus puissant pour l'accès local  Nécessite le serveur Java EE  Impossible d'exécuter sur Tomcat, Jetty, Resin, JRun, Résine  Serveurs Java EE sont généralement beaucoup plus difficile à configurer, considérablement plus lent à démarrer / redémarrer au cours du développement et de test, et coûtent généralement de l'argent  Nécessite la dernière version de Java EE version  Doit mettre à niveau vers les derniers communiqués de serveur  Mauvaise réputation à cause de versions antérieures  EJB2 était si complexe que les EJB a mauvaise réputation à ce jour 5
  • 6.
    Utilisation de l'Industrie(Mots-clés dans Offres d'emploi dans le monde) 6
  • 7.
    Session Beans: Aperçu session de Beans  Sur le serveur, vous faites l'interface (marqué avec @ Remote) et POJO qu'elle met en œuvre (marqués avec @ Stateless)  Ordinaires objet Java avec les méthodes ordinaires qui utilisent des objets Java ordinaires comme arguments et les types de retour  Aucun Etat (vars exemple) maintenu entre les appels de méthode Le client utilise InitialContext.lookup ("nom") pour obtenir la réf.  Client effectue des appels de méthode normale (données sérialisées sur le net.)  Session EJB sans état  Mark POJO avec @ Stateful au lieu de @ Stateless  Mark méthode spéciale avec @ Remove  Le client ne similaires appels de recherche et de méthode, mais il doit appeler la méthode particulière lorsque vous avez terminé.  Etat (vars exemple) maintenu jusqu'à ce que cette méthode appelée 7
  • 8.
  • 9.
    session Beans sansétat: Idée  POJOs  Ordinaire des classes Java; pas d'interfaces ou des classes spéciales parent. Fournissent souvent une sorte de service telles que la cartographie des identifications client à des objets à la clientèle.  L'accès local ou à distance  Peut être consulté soit sur serveur d'application locale (même machine que soft qui utilise les beans) ou serveur d'application distant (machine différente du soft qui utilise les beans)  Ne pas maintenir l'état du client  Les variables d'instance sont protégés contre les conditions de course que pendant un seul appel de méthode. Faut pas stocker l'état du client spécifique qui doit être accessible à travers des appels de méthodes multiples. 9
  • 10.
    session Beans sansétat: Approche • Faire nouvel EJB projet – fichier Nouveau EJB Project • Possibilité de choisir JBoss ou Glassfish comme exécution cible. De toute façon, vous pouvez déployer des projets à la fois aux serveurs. • Définir une interface – Marque avec @ Remote • Pour accéder à d'autres serveurs ou de projets sur le même serveur – Marque avec @ Local • Pour ne permettre l'accès de projets sur un même serveur (par défaut) • Créer une classe qui implémente l'interface – Marque avec des apatrides par défaut du serveur JNDI cartographie @ – Marque AVEC @ Stateless (mappedName = "SomeJndiName") • Déployer application serveur – cliquez R-sur serveur, Ajouter / Supprimer des projets, de démarrer le serveur 10
  • 11.
    EJB Project  fairedes projets  fichier nouveau EJB Project  Choisissez un nom  JBoss ou Glassfish comme cible d'exécution  Vous pouvez ensuite déployer sur n'importe quel serveur compatible; vous n'êtes pas limité à celui choisi initialement.  Facultatif: Ajouter à une EAR  Si vous faites Projet web dynamique plus tard tard qui veut utiliser @ EJB, vous pouvez l'ajouter à la même EAR  Déploiement de projet  cliquez R-sur JBoss ou Glassfish (ou tout autre serveur Java EE 5 que vous avez enregistré avec Eclipse), Ajouter et supprimer des projets, choisissez Projet, Ajouter, Terminer  cliquez R-sur JBoss ou Glassfish (ou autre), Démarrer 11
  • 12.
  • 13.
    Classe qui implémentel'interface 13
  • 14.
    Les clients desession de Beans sans état 14
  • 15.
    Idée  Les clientsestiment que le bean par JNDI  Client Java code ne sais même pas la machine sur laquelle réside le bean  Les clients utilisent bean comme un POJO normal  Mais les arguments et les valeurs de retour sont envoyés à travers le réseau  Ainsi, les classes personnalisées doivent être sérialisables  Code de base InitialContext context = new InitialContext(); InterfaceName bean = (InterfaceName)context.lookup("JNDI-Name"); jndi.properties  Fichier texte dans le classpath; donne URL distante et d'autres infos 15
  • 16.
    Projet client distant Fait nouveau projet Web dynamique  Choisir chanceux numéros-client que le nom  Choisir que JBoss 5 d'exécution cible  Peuvent être déployées pour Glassfish ou d'autres serveurs Java EE 5  jndi.properties  Fichier texte créé, appelé «jndi.properties" dans le dossier src  Doit donner URL distante. Souvent d'autres infos. Spécifiques du serveur!  Détails montré dans la diapositive à venir  Déploiement  N'a pas besoin de courir sur la même machine que le Projet d'EJB.  Autonome (bureau) les clients n'ont pas besoin d'être déployé sur n'importe quel serveur d'application, ils peuvent simplement avoir une "main" méthode.  Applications Web devrait être déployée sur un serveur Java EE 5 app 16
  • 17.
  • 18.
    Remarque sur lenom de context.lookup  Numéro  Vous passez un nom à context.lookup. Si vous utilisez simplement @ Remote sans mappedName, le nom par défaut est différents pour JBoss que pour Glassfish (ou autres serveurs).  Dans JBoss, le nom JNDI serait "NumberServiceBean/remote"  En Glassfish, le nom JNDI serait "coreservlets.bean.NumberService«  Solution: utiliser mappedName  J'utilise @ Stateless (mappedName = "NumberCreator")  au lieu de simplement @ Stateless  Donc, je peux utiliser le même nom (NumberCreator) quel que soit  dont le serveur du projet EJB est déployé pour 18
  • 19.
  • 20.
    Standalone client distant:Résultats  lucky-numbers (EJB Project)  Déployé à JBoss ou Glassfish. La sortie est la même  lucky-nombres-client (Proj Web dynamique.)  Pas encore déployé sur n'importe quel serveur.  jndi.properties correspond au serveur d'EJB projet  sortie 20
  • 21.
    Client Web àdistance (Servlet) 21
  • 22.
    Client Web àdistance(Servlet Suite) 22
  • 23.
    Client Web àdistance(web.xml) 23
  • 24.
    Client Web àdistance(Résultats de JBoss 5) 24
  • 25.
    Client Web àdistance(Résultats Glassfish 2.1) 25
  • 26.
    Utilisation de @EJB pour accéder à des beans locaux 26
  • 27.
    Idée  Utilisez @EJB, avant variable d'instance  Bean sera automatiquement instanciée et assignée. Par exemple:  @ d'EJB privés Certains services mon service;  utile pour les  Un EJB qui utilise un autre d'EJB dans le cadre de sa logique  Toujours une bonne idée puisque les EJBs sont habituellement ensemble  De multiples applications Web qui utilisent la même logique métier  Plus simple, mais application Web ne peut pas passer au serveur distant  restrictions  Avant de variables d'instance, les variables non locales.  Les deux classes doivent faire partie du même EAR sur le même serveur  Dans Eclipse, toutes les classes dans un seul projet d'EJB satisfaire cette  Si vous utilisez un projet EJB (EJB) et des projets web dynamiques (les classes qui utilisent les EJB), vous devez choisir "Ajouter un projet à une EAR» et spécifiez un même 27
  • 28.
  • 29.
    Exemple: classe EJBqui Implémente interface 29
  • 30.
  • 31.
    Exemple: client distant(Servlet Suite) 31
  • 32.
    Client à distant:jndi.properties 32
  • 33.
    Exemple: Client àdistant(web.xml) 33
  • 34.
  • 35.
  • 36.
  • 37.
    Sessions Dynamiques deBeans: Idée  POJOs  Ordinaire des classes Java; aucune des interfaces spéciales ou d'un parent classes. Fournissent souvent une sorte de service qui stocke informations (temporairement) ainsi que de l'envoyer. Local ou accès à distant  Peut être consulté soit sur serveur d'application locale (même machine comme soft qui utilise les beans) ou serveur d'application à distance (différents machine à partir de app qui utilise les beans)  Maintenir l'état du client  Vous pouvez configurer les beans avec le client-spécifiques d'informations, d'accéder ensuite au info (sans crainte de la race conditions) jusqu'à ce que vous appelez la méthode spéciale marquée avec @ Remove. 37
  • 38.
    Sessions Dynamiques deBeans : Approche  Faire nouvel EJB projet  Fichier Nouveau projet EJB  Définir une interface  Marque avec @ Remote  Pour accéder à d'autres serveurs ou de projets sur le même serveur  Marque avec @ Local  Pour ne permettre l'accès de projets sur un même serveur (par défaut)  Créer une classe qui implémente l'interface  Marque avec @ Dynamique pour serveur JNDI cartographie  Marque avec @ (Stateful mappedName = "SomeJndiName")  Marquer une méthode avec @ Retirer  Lorsqu'elle est appelée, le serveur termine la session et l'instance de GC  Déployer application serveur  cliquez R-sur serveur, Ajouter / Supprimer des projets, de démarrer le serveur 38
  • 39.
  • 40.
    Exemple: Classe EJBqui implémente l'interface 40
  • 41.
    Exemple: Classe EJBqui implémente l'interface (suite) 41
  • 42.
  • 43.
    Exemple: client distant(Servlet Suite) 43
  • 44.
    Exemple: : clientdistant (JSP) 44
  • 45.
    Exemple: client distant(jndi.properties) 45
  • 46.
    Exemple: : clientdistant (web.xml) 46
  • 47.
    Exemple: client distant(formulaire de saisie) 47
  • 48.
    Résultats : clientdistant (JBoss 5) 48
  • 49.
    Résultat: client distant(Glassfish 2.1) 49
  • 50.
  • 51.
    Livres et références EJB 3 en action  Debu Panda, Reza Rahman, et Derek Lane (Manning)  Enterprise JavaBeans 3.0 (5e édition)  Bill Burke et Richard Monson-Haefel (O'Reilly)  Tutoriel Java EE 5 (EJB section)  http://java.sun.com/javaee/5/docs/tutorial/doc/bnblr.html  JBoss EJB3 Tutoriel  http://docs.jboss.com/ejb3/app-server/tutorial/  Glassfish EJB FAQ  https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html  Cay Horstmann EJB Tutoriel  http://www.horstmann.com/elvis/elvis-meets-glassfish.html 51
  • 52.
    Résumer  Session deBeans  Interface: marque avec @ Remote  Classe: marque avec @ Stateless (mappedName = "blah")  Session d’ EJB Dynamique  Classe Marque avec @ Dynamique lieu de @ Stateless  Marquer une méthode avec @ Retirer  session Clients bean InitialContext context = new InitialContext (); InterfaceType var = (InterfaceType) context.lookup ("blah"); var.someMethod (args);  Pour les beans avec état, appelez la méthode spécialement marqués lorsque vous avez terminé  Besoin jndi.properties spécifiques au type de serveur  L'accès local aux beans @EJB private InterfaceType var; 52
  • 53.