Je me demande comment est le meilleur moyen d'intégrer les modules Java développés sous forme d'applications j (2) EE distinctes. Chacun de ces modules expose les interfaces Java. Les entités pojo (hibernate) sont utilisées avec ces interfaces Java, il n'y a pas d'objets DTO. Quelle serait la meilleure façon d'intégrer ces modules I.e. Un module appelant l'autre interface de module à distance? P>
Je pensais à: EJB3, Hesse, Savon, JMS. Il y a des avantages et des inconvénients de chacune des approches. P>
gens, quelle est votre opinion ou vos expériences? p>
6 Réponses :
J'irais pour le savon. P>
JMS serait plus efficace, mais vous auriez besoin de corriger un bean piloté par message pour chaque interface. P>
Savon d'autre part est livré avec de nombreux kits à outils utiles qui généreront la définition de votre message (WSDL) et tous les gestionnaires de la NECCESSARY (client et serveur) lorsqu'il est donné un EJB. P>
Avec du savon, vous pouvez (mais ne devez pas avoir à) traiter la sécurité des certificats et sécuriser les connexions sur les réseaux publics. Comme le protocole par défaut est HTTP sur le port 80, vous aurez une douleur minimale avec des pare-feu, etc. Le savon est également idéal pour les clients hétrogéniers (dans votre cas tout ce qui n'est pas J2EE) avec un bon soutien pour la plupart des langues ordinaires sur la plupart des plateformes communes. p>
JMS est conçu pour la communication asynchrone, c'est-à-dire feu et oublie. Donc, si vous avez besoin d'une réponse d'un appel de service, vous aurez besoin de deux canaux de message pour recevoir le message et l'autre pour renvoyer la réponse à l'expéditeur.
La question que je vois avec le savon est que l'utilisation de cette technique nécessite une définition du schéma XML que je peux ensuite utiliser pour lier XML à l'objet (JAXB). Comme je l'ai dit dans mon poste d'origine, l'objectif est d'éliminer les DTO et d'utiliser des entités modèles (Hibernate / JPA) lorsque cela est possible. Le problème avec DTO est que la couche de conversion est requise entre les DTO et les entités.
@PJP: Pas exactement. Vous pouvez utiliser le modèle qui implique des files d'attente privées (pour une session) pour recevoir la réponse. Fondamentalement, le client crée une file d'attente temporaire, définit «ReplyTo» pour le message de demande et incendie le message à la file d'attente de la demande publique. Le répondeur reçoit le message de demande, débute de la logique, crée un message de réponse et envoyez-le à la file d'attente temporaire spécifiée dans "ReplyTo" du message de demande.
Si vous avez besoin de communication réseau entre les applications Java uniquement, Java RMI est la voie à suivre. Il a la meilleure intégration, la plus transparente et la moins générale. P>
Si, toutefois, certains de vos clients ne sont pas basés sur Java, vous devriez probablement envisager d'autres options (Java RMI dispose d'une dialecte IIOP, ce qui lui permet d'interagir avec Corba, mais je ne recommanderais pas de faire Ceci, à moins que ce ne soit pour une intégration de code hérité). Selon vos besoins, lesservices sont probablement votre ami. Si vous êtes conclu avec la charge de réseau, vous pourriez aller desservices sur Hesse. P>
Vous voulez dire littéralement à distance? Comme dans la course dans un environnement différent avec des caractéristiques de disponibilité différentes? Avec des frais généraux de réseau? P>
En supposant que "oui", ma première étape consisterait à adopter une approche de service, de mettre de côté la technologie d'invocation un instant. Considérez simplement la conception et la signification de vos services. Vous savez qu'ils sont coûteux coûteux à invoquer, d'où les petites interfaces occupées ont tendance à être une mauvaise chose. Vous savez que le système de service peut échouer entre des invocations, vous pouvez donc favoriser les services apatrides. Vous devrez peut-être réessayer des demandes après échec. Vous pouvez donc favoriser des conceptions de services idempotents. P>
Ensuite, envisagez les relations de disponibilité. Votre client peut-il fonctionner sans le système distant. Dans certains cas, vous ne pouvez tout simplement pas progresser si le système distant n'est pas disponible (par exemple. Impossible d'activer l'employé si vous ne pouvez pas accéder au système HR) dans d'autres cas, vous pouvez adopter un «feu-et-dire -Me-plus tard "philosophie; Faites la queue des demandes et des réponses de processus ultérieurement. P>
Lorsqu'il existe une disponibilité de Depdy, il suffit d'exposer une interface synchrone semble être adaptée. Vous pouvez le faire avec SLSB EJBS, si tout est Java EE, cela fonctionne. J'ai tendance à généraliser à cet égard que si mes services sont utiles, les clients non Java EE peuvent également les vouloir. Donc, le savon (ou le repos) a tendance à être utile. Ces jours-ci, l'ajout d'une interface de service Web à votre SLSB est assez trivial. P>
Mais ma théorie des animaux de compagnie est que tout système informatique suffisamment élevé finit par nécessiter des communications Aynch: vous devez découpler les contraintes de disponibilité. Donc, j'aurais tendance à chercher une relation de style JMS. Une façade de MDB devant vos services ou SOAP / JMS n'est pas trop difficile à faire. Une telle approche a tendance à mettre en évidence les problèmes de conception de cas d'échec qui se cachent probablement de toute façon, JMS a tendance à vous faire penser: «Supposons que je ne reçois pas de réponse? Supposons que ma réponse arrive en retard?" P>
L'approche standard consisterait à utiliser un RMI uni entre les différents composants de service, mais cela apporte des problèmes de partage de vos interfaces Java et de vos modifications de votre modèle de votre domaine, en particulier si vous avez de nombreux composants utilisant les mêmes classes. P>
Concentrez-vous vraiment chaque service dans une machine virtuelle séparée? Si ces EJB se parlent toujours les uns aux autres, vous êtes préférable de les mettre dans le même VM et d'éviter les appels de procédure à distance, car ces services peuvent utiliser leurs conférences locales. P>
L'autre chose qui peut vous mordre, vous utilisez Hibernate Pojos. Vous pensez peut-être que ce sont des pojos simples mais derrière les scènes Hibernate ont été occupés par CGLIB essayant de faire des choses comme permettre une initialisation paresseuse. Si ces haricots sont sérialisés et passés sur des limites à distance, vous risquez de vous retrouver avec une exception hibernate impair à être arrêtée. Personnellement, je préférerais créer des DTO simples ou écrire les pojos en tant que XML pour passer entre les composants. Mes collègues iraient encore plus loin et écrivent des protocoles de fil personnalisés pour transférer les données pour des raisons de performance. P>
Récemment, j'ai utilisé le Mule ESB pour intégrer divers composants de service. C'est assez agréable que vous puissiez avoir un mélange de RMI, de sockets, de services Web, etc. sans avoir à écrire la majeure partie du code de la plaque de la chaudière. P>
J'avais oublié où ma préférence à Vos / Dtos était venue - c'était méchant Hibernate Loge-chargement d'un problème de chargement paresseux lorsque leurs implémentations de collecte sont sérialisées avec la session hibernate qui est effectivement dénuée de sens sans signification dans le code d'appel - attention à celui-ci.
Un moyen rapide de sérialiser les pojos serait d'utiliser Xtream. Ce n'est pas aussi agréable que d'utiliser votre propre XSD mais c'est assez bon pour envoyer des données sur des systèmes que vous contrôlez. XStream.codehaus.org
Nick, c'est quelque chose qui me dérange beaucoup! Je n'étais pas grand fan des Vos / Dto, mais j'ai commencé à penser à me pencher un peu plus :)
@PREGZT - Je pense qu'il existe des différents subtils avec les objets que vous utilisez pour votre protocole Wire (les VOS / DTO) et ceux que vous utilisez dans votre application (les pojos). Le plus évident que je puisse penser est Vos / Dto ayant des getters et des setters pour tous les attributs tandis que j'aime les pojos à avoir seulement un réglage pour des attributs véritablement readwrite, car il aide à communiquer avec d'autres développeurs ce qui peut et ne peut pas être défini.
Pourquoi iriez-vous avec autre chose que la chose la plus simple qui fonctionne? p>
Dans votre cas, cela ressemble à EJB3 ou peut-être JMS, selon que la communication doit être synchrone ou asynchrone. p>
EJB3 est de loin ces étant construits les plus faciles sur le RMI avec le conteneur offrant toutes les fonctionnalités supplémentaires dont vous pourriez avoir besoin - de sécurité, des transactions, etc. Vos pojos sont probablement dans un bocal partagé et peuvent donc simplement être passés entre vos EJBS. , bien que j'ai tendance à transmettre moi-même des objets de valeur. L'autre avantage de l'EJB est, quand c'est bien fait, que c'est le plus performant (c'est juste mon opinion BTW; -). P>
JMS est un peu plus impliqué, mais pas beaucoup et un système basé sur une communication asynchrone offre à certaines banalités en termes de parallèle des tâches, etc. p>
La surcharge de performances des services Web, la configuration supplémentaire inévitable et les points d'échec supplémentaires les font, IMHO, ne valent pas la peine que vous avez besoin que vous ayez obligé leur utilisation - je pense interoper avec des clients non-Java ou fournir des données aux parties externes ici. p>
La réponse de PJP ci-dessus m'a rappelé pourquoi je préfère les DTO - pour le chargement paresseux de fonctionner la session hibernate se met en œuvre partout, la plus perceptible dans leurs implémentations de collecte. Lorsque ces objets sont sérialisés, la session hibernate est également et elle est sans danger sans client, soufflant lorsqu'elle est invoquée. Il existe une méthode hibernate.Initialize (objet) qui peut être appelée à travailler autour de cela, mais ma préférence est toujours DTO
Après avoir fait barboter de quelques-unes des technologies de télécommande et les a trouvés universellement uniques, j'utiliserais désormais la reprise de printemps comme abstraction de la mise en œuvre. Il vous permet de vous concentrer sur l'écriture de votre fonctionnalité et de laisser le ressort de la partie distante avec une configuration. Vous avez le choix entre plusieurs implémentations (RMI, invocateur HTTP, HESSIAN, HESSIEN, HESSION, HELLAP et JMS). L'abstraction signifie que vous pouvez choisir une implémentation et simplement l'échanger si vos besoins changent. Voir le Springsource Docs pour plus d'informations. P >
Nous utilisons cela dans un système avec HTTP du client au serveur (requis pour des raisons de sécurité) et en utilisant des appels JMS et EJB pour le service des appels de service.