Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
issue76:tutoriel_-_spring_integration [2014/02/10 22:28] – [8] fredphil91 | issue76:tutoriel_-_spring_integration [2014/02/11 14:50] (Version actuelle) – [8] auntiee |
---|
Before delving deeper, let me explain what Spring Integration is intended for. As their site suggests: “it provides an extension of the Spring programming model to support the well-known Enterprise Integration Patterns”. Rephrasing, to design good enterprise applications one could use messaging (more precisely asynchronous messaging) that enables diverse applications to be integrated with each other – without nightmares or pain. A wise guy named Martin Fowler has written a famous book: “Enterprise Integration Patterns”. Folks from Spring probably one day decided to materialize a theory into practice. Very pragmatic approach, isn’t it? Later, you will see how wonderful it is for regular tasks. The main concept of SI is: Endpoint, Channel and Message.** | Before delving deeper, let me explain what Spring Integration is intended for. As their site suggests: “it provides an extension of the Spring programming model to support the well-known Enterprise Integration Patterns”. Rephrasing, to design good enterprise applications one could use messaging (more precisely asynchronous messaging) that enables diverse applications to be integrated with each other – without nightmares or pain. A wise guy named Martin Fowler has written a famous book: “Enterprise Integration Patterns”. Folks from Spring probably one day decided to materialize a theory into practice. Very pragmatic approach, isn’t it? Later, you will see how wonderful it is for regular tasks. The main concept of SI is: Endpoint, Channel and Message.** |
| |
Il y a quelque temps, j'ai commencé un nouveau boulot dans une grande société. Ma première tâche était de réimplémenter/porter leur client tcp de C# en Java. Les convertisseurs existants fonctionnant mal, je l'ai fait manuellement. Après environ une semaine, le nouveau client tcp et le nouveau simulateur de serveur étaient écrits en Java et prêts à être utilisés. Après avoir répondu aux exigences du client, nous avons constaté que l'implémentation en Java manquait de caractéristiques importantes telles que la gestion de panne et l'auto- reconnexion. Ajouter ces fonctionnalités nécessitait que l'on ajoute du code non testé, qui risquait de ne pas gérer la logique métier. Un de nos collègues a dit : Ah ah, et si… ? Nous pourrions remplacer l'implémentation en Java avec une autre, par exemple - Spring Integration. Nous avons rigolé en pensant : mais qu'est-ce qu'il raconte ? Quoi qu'il en soit, c'est un bon garçon, qui essaie d'utiliser les meilleures technologies disponibles. Nous avons eu le feu vert pour faire des recherches et apprendre quelque chose d'excitant. Pour simplifier nos besoins, je vais parler d'un simulateur (c'est-à-dire un serveur) et d'un client. | Il y a quelque temps, j'ai commencé un nouveau boulot dans une grande société. Ma première tâche était de réimplémenter/porter leur client tcp de C# en Java. Les convertisseurs existants fonctionnant mal, je l'ai fait manuellement. Après environ une semaine, le nouveau client tcp et le nouveau simulateur de serveur étaient écrits en Java et prêts à être utilisés. Après avoir répondu aux exigences du client, nous avons constaté que l'implémentation en Java manquait de caractéristiques importantes telles que la gestion de panne et l'auto-reconnexion. Ajouter ces fonctionnalités nécessitait l'ajout de code non testé, qui risquait de ne pas gérer la logique métier. Un de nos collègues a dit : Aha, et si… ? Nous pourrions remplacer l'implémentation en Java par une autre, par exemple - Spring Integration. Nous avons rigolé en pensant : mais qu'est-ce qu'il raconte ? Quoi qu'il en soit, c'est un bon garçon, qui essaie d'utiliser les meilleures technologies disponibles. Nous avons eu le feu vert pour faire des recherches et apprendre quelque chose de passionnant. Pour simplifier nos besoins, je vais parler d'un simulateur (c'est-à-dire, un serveur) et d'un client. |
| |
Avant de plonger plus profondément, laissez-moi vous expliquer pour quoi Spring Integration est conçu. Comme leur site l'indique : « cela fournit une extension du modèle de programmation Spring qui supporte les modèles bien connus d'intégration de l'entreprise (Enterprise Integration Patterns) ». Pour reformuler, cela permet de concevoir de bonnes applications d'entreprise en utilisant des messages (plus précisément une messagerie asynchrone) qui permet à diverses applications de s'intégrées les unes aux autres - sans peine ni douleur. Un gars sage du nom de Martin Fowler a écrit un livre célèbre : « Enterprise Integration Patterns ». Les gens de Spring ont sans doute décidé un jour de matérialiser une théorie en pratique. Approche très pragmatique, n'est-ce pas ? Plus tard, vous verrez combien c'est merveilleux pour des tâches récurrentes. Les concept principaux du SI sont : Endpoint, Channel et Message (nœud d'échange, canal et message). | Avant d'y plonger plus profondément, laissez-moi vous expliquer pour quelle fonction Spring Integration est conçu. Comme leur site l'indique : « cela fournit une extension du modèle de programmation Spring qui supporte les modèles bien connus d'intégration de l'entreprise (Enterprise Integration Patterns) ». Pour reformuler, cela permet de concevoir de bonnes applications d'entreprise en utilisant des messages (plus précisément une messagerie asynchrone) qui permet à diverses applications de s'intégrer les unes aux autres, sans cauchemar ni douleur. Un sage du nom de Martin Fowler a écrit un livre célèbre : //Enterprise Integration Patterns//. Les gens de Spring ont sans doute décidé un jour de transformer une théorie en pratique. Approche très pragmatique, n'est-ce pas ? Plus tard, vous verrez combien c'est merveilleux pour des tâches récurrentes. Les concepts principaux du SI sont : Endpoint, Channel et Message (nœud d'échange, canal et message). |
| |
====== 2 ====== | ====== 2 ====== |
An important thing with SI is a configuration file which contains all the necessary components we’re going to use. Here is the “server” part of the configuration. Simplifying a model and SI lifecycle, Spring creates objects that are defined in the configuration xml. More generally, such a concept is called declarative programming. You define a business object in the xml, and a framework generates appropriate classes for you, and injects and initializes dependencies. The mantra says: you should be concentrated only on the business and not on the implementation.** | An important thing with SI is a configuration file which contains all the necessary components we’re going to use. Here is the “server” part of the configuration. Simplifying a model and SI lifecycle, Spring creates objects that are defined in the configuration xml. More generally, such a concept is called declarative programming. You define a business object in the xml, and a framework generates appropriate classes for you, and injects and initializes dependencies. The mantra says: you should be concentrated only on the business and not on the implementation.** |
| |
Le nœud d'échange est un composant qui agit sur un message. Un message est un contenant composé d'en-tête et d'une charge utile. L'en-tête contient des données qui sont pertinentes pour le système de messagerie et la charge utile contient les données réelles. Un canal relie deux ou plusieurs nœuds d'échange, il est semblable à des « tubes » (pipes) Unix. Deux nœuds peuvent échanger des messages s'ils sont reliés par un canal. Assez facile, n'est-ce pas ? Le schéma suivant montre cela. | Le nœud d'échange est un composant qui agit sur un message. Un message est un contenant composé d'en-tête et d'une charge utile. L'en-tête contient des données qui sont pertinentes pour le système de messagerie et la charge utile contient les données réelles. Un canal relie deux ou plusieurs nœuds d'échange ; il est semblable à des « tubes » (pipes) Unix. Deux nœuds peuvent échanger des messages s'ils sont reliés par un canal. Assez facile, n'est-ce pas ? Le schéma suivant montre cela. |
| |
La prochaine étape pour notre cours intensif sera de définir les exigences. Je dirais que nous avons besoin d'un serveur (tcp) et d'un client tcp. Nous allons écrire une application simple qui va échanger quelques messages entre les deux. | La prochaine étape pour notre cours intensif sera de définir les exigences. Je dirais que nous avons besoin d'un serveur (tcp) et d'un client tcp. Nous allons écrire une application simple qui va échanger quelques messages entre les deux. |
| |
Une chose importante dans le SI est un fichier de configuration qui contient tous les composants que nous allons utiliser. Voici la partie « serveur » de la configuration. Pour simplifier le modèle et le cycle de vie du SI, Spring crée des objets qui sont définis dans le fichier xml de configuration. Plus généralement, un tel concept est appelé programmation déclarative. Vous définissez un objet métier dans le xml, et un outil (« framework ») génère les classes appropriées pour vous, et injecte et initialise les dépendances. Le mantra dit : vous devez être concentré uniquement sur le travail et non sur la mise en œuvre. | Une chose importante dans le SI est un fichier de configuration qui contient tous les composants que nous allons utiliser. Voici la partie « serveur » de la configuration. Pour simplifier le modèle et le cycle de vie du SI, Spring crée des objets qui sont définis dans le fichier xml de configuration. Plus généralement, un tel concept est appelé programmation déclarative. Vous définissez un objet métier dans le xml et un outil (« framework ») génère les classes appropriées à votre place, puis injecte et initialise les dépendances. Le mantra dit : vous devez être concentré uniquement sur le travail et non sur la mise en œuvre. |
| |
====== 3 ====== | ====== 3 ====== |
Nous allons définir une partie du fichier xml de configuration (page suivante, en haut à gauche), la partie serveur : http://pastebin.com/6AHQWPse | Nous allons définir une partie du fichier xml de configuration (page suivante, en haut à gauche), la partie serveur : http://pastebin.com/6AHQWPse |
| |
Les choses importantes sont : une usine (tcp-connection-factory) - crée un serveur TCP en utilisant un tableau sérialiseur d'une longueur d'un octet. Un sérialiseur est nécessaire pour « emballer » notre message d'une façon, de l'encoder afin de le transmettre par un câble. D'autre part, un désérialiseur est nécessaire pour « déballer » notre message, le décoder. Spring Integration possède deux usines - une pour le client et une autre pour le serveur. La différence est le type [serveur ou client]. Un port écoute les messages entrants. Une adresse IP n'est pas mentionnée ici, car le serveur s'exécute en tant que localhost (serveur local). | Les choses importantes sont : une usine (tcp-connection-factory) crée un serveur TCP en utilisant un tableau sérialiseur d'une longueur d'un octet. Un sérialiseur est nécessaire pour « emballer » notre message, c-à-d l'encoder afin de le transmettre par un câble. D'autre part, un désérialiseur est nécessaire pour « déballer » notre message, autrement dit, le décoder. Spring Integration possède deux usines : une pour le client et l'autre pour le serveur. La différence est le type [serveur ou client]. Un port écoute les messages entrants. Une adresse IP n'est pas mentionnée ici, car le serveur s'exécute en tant que localhost (serveur local). |
| |
Nous avons également défini deux canaux : serverIn (pour les messages entrants) et serverOut (pour les messages sortants). Pour que notre serveur puisse envoyer et recevoir des messages, nous définissons des adaptateurs entrants et sortants qui sont associés à l'usine et aux canaux. Dans notre cas, ils définissent les nœuds d'échange. Donc, quand un message arrive, quelque chose doit s'en occuper. Cette responsabilité exige un service, à savoir le service d'envoi de fichier. S'il accepte un message, il envoie un fichier en tâche de fond, ligne par ligne, vers le client. En gros, quand un serveur démarre, il écoute les messages entrants. Cependant, seuls des messages spécifiques seront acceptés, et, lorsqu'il sont acceptés, le serveur envoie ligne par ligne le fichier. Si une erreur se produit, elle est acheminé vers le canal d'erreur. On utilise pour cela un intercepteur. | Nous avons également défini deux canaux : serverIn (pour les messages entrants) et serverOut (pour les messages sortants). Pour que notre serveur puisse envoyer et recevoir des messages, nous définissons des adaptateurs entrants et sortants qui sont associés à l'usine et aux canaux. Dans notre cas, ils définissent les nœuds d'échange. Donc, quand un message arrive, quelque chose doit s'en occuper. Cette responsabilité exige un service, à savoir le service d'envoi de fichier. S'il accepte un message, il envoie un fichier en tâche de fond, ligne par ligne, vers le client. En gros, quand un serveur démarre, il écoute les messages entrants. Cependant, seuls des messages spécifiques seront acceptés et, lorsqu'il sont acceptés, le serveur envoie un fichier ligne par ligne. Si une erreur se produit, elle est acheminée vers le canal d'erreur. On utilise pour cela un intercepteur. |
| |
====== 4 ====== | ====== 4 ====== |
| |
Je voudrais dire quelques mots sur le cycle de vie du SI. Le framework Spring a deux paquets « principaux » : org.springframework.beans et org.springframework.context | Je voudrais dire quelques mots sur le cycle de vie du SI. Le framework Spring a deux paquets « principaux » : org.springframework.beans et org.springframework.context |
qui construisent le cœur de l'utilitaire d'injection de dépendances du composant. L'interface org.springframework.beans.factory.BeanFactory fournit des méthodes de cycle de vie de base (démarrage et arrêt) pour l'initialisation et la destruction du bean. org.springframework.context.ApplicationContext offre une intégration AOP, la gestion des ressources du message, et même plus. | qui construisent l'important utilitaire d'injection de dépendances du composant. L'interface org.springframework.beans.factory.BeanFactory fournit des méthodes de base de cycle de vie (démarrage et arrêt) pour l'initialisation et la destruction du bean. org.springframework.context.ApplicationContext offre une intégration AOP, la gestion des ressources du message et plus encore. |
| |
Notre serveur est prêt... Je veux dire, tout à fait prêt. Pour exécuter l'exemple, suivez les étapes ci-dessous : | Notre serveur est prêt... Je veux dire, tout à fait prêt. Pour exécuter l'exemple, suivez les étapes ci-dessous : |
Le code source peut être trouvé ici : http://pastebin.com/6PMpWTfX | Le code source peut être trouvé ici : http://pastebin.com/6PMpWTfX |
| |
Nous définissons également un service d'envoi de fichier. Ceci est illustré à la page suivante, en haut à gauche. Le code est là: http://pastebin.com/icHRdQS3 | Nous définissons également un service d'envoi de fichier. Ceci est illustré à la page suivante, en haut à gauche. Le code est ici : http://pastebin.com/icHRdQS3 |
| |
Ensuite, voici un exécuteur du boulot. Ce code est indiqué sur la page suivante, en bas à gauche. Le code peut être récupéré ici : http://pastebin.com/LZRdZ3Tg | Ensuite, voici un exécuteur du boulot. Ce code-là est montré sur la page suivante, en bas à gauche. Le code peut être récupéré ici : http://pastebin.com/LZRdZ3Tg |
| |
Enfin, pour le serveur, nous écrivons un gestionnaire d'erreur, qui enregistre les erreurs que l'on voit ci-dessus. Le code est là : http://pastebin.com/2EQvbVR8 | Enfin, pour le serveur, nous écrivons un gestionnaire d'erreur, qui enregistre les erreurs et que l'on voit ci-dessus. Le code est là : http://pastebin.com/2EQvbVR8 |
| |
À ce stade, nous en avons terminé avec notre serveur. | À ce stade, nous en avons terminé avec notre serveur. |
Almost the same logic applies here. Have a look. A main class has the lines shown in the code on the next page, top left.** | Almost the same logic applies here. Have a look. A main class has the lines shown in the code on the next page, top left.** |
| |
Maintenant, nous allons définir un client TCP qui se connecte au serveur, envoie un message d'acceptation, et obtient un fichier envoyé par le serveur. | Maintenant, nous allons définir un client TCP qui se connecte au serveur, envoie un message d'acceptation et obtient un fichier envoyé par le serveur. |
| |
Notre fichier de configuration se présente comme suit : http://pastebin.com/egquzq5q | Notre fichier de configuration se présente comme suit : http://pastebin.com/egquzq5q |
| |
Voici comment faire fonctionner un client : | Voici comment faire fonctionner un client : |
| |
Ouvrez un nouveau terminal : | Ouvrez un nouveau terminal : |
| |
} | } |
| |
Et le dernier est un intercepteur, qui informera votre application sur : i. Message envoyé; ii. Une connexion est fermée; iii. Une nouvelle connexion est ajoutée. | Et le dernier est un intercepteur, qui informera votre application sur : i. Message envoyé ; ii. Une connexion est fermée ; iii. Une nouvelle connexion est ajoutée. |
| |
C'est tout ! | C'est tout ! |
| |
Pour jouer avec le code, voir ici : http://www.4shared.com/zip/eF4q7l0k/spring_integration_example.html. | Pour vous amuser avec le code, voir ici : http://www.4shared.com/zip/eF4q7l0k/spring_integration_example.html. |
| |
====== 8 ====== | ====== 8 ====== |
• testé ; | • testé ; |
• communauté amicale et agréable ; | • communauté amicale et agréable ; |
• si vous avez des questions, les gens répondre très rapidement ; | • si vous avez des questions, les gens répondent très rapidement ; |
• il y a des tonnes d'exemples ; | • il y a des tonnes d'exemples ; |
• API simple et complète. | • API simple et complète. |
| |
Inconvénients : | Inconvénients : |
• cela prend du temps pour apprendre et comprendre comment l'utiliser ; | • il faut du temps pour apprendre et comprendre comment l'utiliser ; |
• si vous avez des problèmes, il est parfois difficile de déboguer. | • si vous avez des problèmes, il est parfois difficile de déboguer. |
| |