Question

Je suis en train d'écrire un adaptateur de ressources JCA. Je suis aussi, je vais, en essayant de comprendre la partie de gestion de connexion de la spécification JCA. Comme une expérience de pensée, prétendre que le seul client de cet adaptateur sera un Java Swing application client situé sur une autre machine. Supposons également que l'adaptateur de ressources communiquera avec son « système d'information d'entreprise » (EIE) sur le réseau ainsi.

Si je comprends bien la spécification JCA, le fichier .rar est déployé sur le serveur d'applications. Le serveur d'application crée l'implémentation de l'interface ManagedConnectionFactory du fichier .rar. Il demande alors à produire une usine de connexion, ce qui est l'objet opaque qui est déployé à JNDI pour l'utilisateur à utiliser pour obtenir une connexion à la ressource. (Dans le cas de JDBC, l'usine de connexion est un javax.sql.DataSource.)

Il est nécessaire que l'usine de connexion conserve une référence au fournie par l'application serveur ConnectionManager, qui, à son tour, est nécessaire pour être Serializable. Cela est logique - pour que l'usine de connexion à stocker dans JNDI, il doit être sérialisable, et pour que pour garder une référence au ConnectionManager, ConnectionManager doit être sérializable. Donc bien, ce petit objet graphique est installé dans l'arborescence JNDI du client d'application.

C'est là que je commence à avoir mal au cœur. Le ConnectionManager - la pièce fournie par le serveur d'application qui est censé gérer la gestion de la connexion, le partage, la mise en commun, etc .-- entièrement présent sur le client à ce moment? L'un de ses emplois est de créer des instances de ManagedConnection, et un ManagedConnection n'est pas nécessaire d'être Serializable, et la connexion de l'utilisateur le manipule ne sont pas non vends nécessaire pour être Serializable. Cela me porte à croire que tout le mécanisme de mise en commun de connexion est livré en gros au client de l'application et fourra dans son arbre JNDI.

Est-ce que cela veut dire que les interactions JCA de la dérivation côté client le componentry côté serveur du serveur d'application? Où sont les limites du réseau dans l'API JCA?

Était-ce utile?

La solution

  

Est-ce que cela veut dire que JCA   interactions du côté client   contourner le componentry côté serveur de   le serveur d'application? Où sont les   les limites du réseau dans l'API JCA?

AFAIK, oui. Il y aura un JNDI local et la JNDI locale retournera les connexions locales. Même si cela est vrai pour d'autres types d'objet dans le JNDI, une telle valeur de configuration (env-entry). Bien sûr, si vous regardez un EJB, l'usine retourne un proxy à la fève à distance, mais le JNDI est toujours locale à ma connaissance.

Le client intègre sa propre piscine. Cela signifie, comme vous l'avez dit, que les connexions obtenues dans le client échapperont l'appareil côté serveur.

Il est encore pire quand on commence à jouer avec les transactions distribuées. Un client peut obtenir un UserTransaction pour démarrer et arrêter les transactions distribuées sur le côté client (pas toutes l'application. Serveur prend en charge cela, cependant). Le contexte de la transaction sera propage au cours des appels à distance EJB. Une transaction distribuée peut alors étendre les connexions côté client et les connexions côté serveur.

Selon la philosophie J2EE, un client d'application ne devrait normalement pas utiliser des transactions et obtenir une connexion directe; il doit uniquement communiquer avec EJB à distance.

Les spécifications ne sont pas vraiment claires sur le scénario plus compliqué et il n'y a pas beaucoup d'informations autour. Les spécifications ne pas, par exemple, le mandat serveur d'application pour exposer le UserTransaction au client.

Ce que j'écrit applique ici pour GlassFish au moins, mais je ne se baserait pas sur une mise en œuvre cohérente de ces caractéristiques dans tous les serveurs d'applications.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top