2. Votre repository doit être **privé**. Vous devez le partager avec votre encadrant de TP.
3. vous obtiendrez un nouveau lien : par exemple git@gitlab.istic.univ-rennes1.fr:monpseudo/....
4. Dans le **workspace d'eclipse** faites `git clone git@gitlab.istic.univ-rennes1.fr:monpseudo/...` avec l'url précédente.
5. Ouvrez le workspace dans eclipse.
6. Utilisez Import> "Existing Maven Projects".
7. Selectionnez le projet et validez.
Vous devriez avoir une version du projet dans votre propre compte gitlab.
Vous pouvez le partager avec votre binome et l'encadrant de TP.
## Rapport
Votre rapport doit être écrit ici en markdown. :/
Vous trouverez la syntaxe de markdown ici : https://docs.gitlab.com/ee/user/markdown.html
Placez vos images dans le répertoire images si nécessaire.
### Binôme :
Thibaut ROCHAS, Tuan Minh VU
### Introduction
On a utilisé CloudAMQP, qui semblait être la solution la plus simple pour commencer le TP rapidement.
On a utilisé CloudAMQP, qui semblait être la solution la plus meilleur solution pour commencer le TP rapidement.
Les exemples ont tous été testés, avec notre serveur RabitMQ.
Avec l’aide des exemples et du cours, on a pu faire la partie Date sans grande difficulté.
Ensuite, le chat n’était pas très compliqué, on a fait le bonus espion.
@@ -36,78 +15,316 @@ Ensuite, le chat n’était pas très compliqué, on a fait le bonus espion.
### Déroulement du TP
#### Exemples
Pour les exemples il suffisait simplement de remplacer "localhost" dans le setHost du ConnectionFactory par l’URL de notre serveur RabbitMQ.
Le premier exemple envoie juste un seul message "Hello World", et on enregistre dans le receveur une action à effectuer à chaque message, ici il affiche simplement le message.
Sur le 2ème exemple, l’envoyeur NewTask prend ces arguments, les concatène en un message qu’il envoie au worker, qui va effectuer une action à chaque message reçu : il affiche le message puis attend 1 seconde pour chaque point dans le message reçu, et affiche "done" quand il a fini.
L’exemple 3 prend encore des arguments, il envoie à tous les Receveurs car le type d’échange est "fanout", ici le receveur affiche simplement le message.
Dans l’exemple 4, on utilise le type d’échange "direct", avec des topics, il faut donc aussi fournir le topic en argument en plus du message pour l’envoyeur, et le receveur on lui fournit les topics qu’il doit s’abonner.
L’exemple 5 fait la même chose que le 4, mais avec un type d’échange "topic", il y a donc une hiérarchie dans les topics.
Le dernier exemple est une communication RPC, le client envoie un message et le serveur répond en fonction de ce message.
Pour les exemples il suffisait simplement de remplacer "localhost" dans le setHost du ConnectionFactory par l’URL de notre serveur RabbitMQ.<br>
<br>
Le premier exemple envoie juste un seul message "Hello World", et on enregistre dans le receveur une action à effectuer à chaque message, ici il affiche simplement le message.<br>
<br>
Sur le 2ème exemple, l’envoyeur NewTask prend ces arguments, les concatène en un message qu’il envoie au worker, qui va effectuer une action à chaque message reçu : il affiche le message puis attend 1 seconde pour chaque point dans le message reçu, et affiche "done" quand il a fini.<br>
<br>
L’exemple 3 prend encore des arguments, il envoie à tous les Receveurs car le type d’échange est "fanout", ici le receveur affiche simplement le message.<br>
<br>
Dans l’exemple 4, on utilise le type d’échange "direct", avec des topics, il faut donc aussi fournir le topic en argument en plus du message pour l’envoyeur, et le receveur on lui fournit les topics qu’il doit s’abonner.<br>
<br>
L’exemple 5 fait la même chose que le 4, mais avec un type d’échange "topic", il y a donc une hiérarchie dans les topics.<br>
Le dernier exemple est une communication RPC, le client envoie un message et le serveur répond en fonction de ce message.<br>
#### Date
A partir de l'exemple 3, on envoi simpelment la date, avec le même échange de type fanout. Pour généré la date on fait simplement une fonction getDate() qui return (new Date()).toString();
Le reste est identique à tuto3.java
Chaque client reçoivent le message du serveur
À partir de l'exemple 3, on envoie simplement la date, avec le même échange de type fanout. Pour générer la date, on fait simplement une fonction getDate() qui retourne (new Date()).toString();<br>
Le reste est identique à tuto3.java.<br>
Chaque client reçoit le message du serveur correctement.<br>
<br>
Pour tester on a executé un EnvoyerDate, et 2 RecevoirDate :
Pour la version de partages d'un même fil, c'est la même chose que la version précédente mais cette fois si un seul client reçoi le message, tout les client de recoivent donc pas tout les message, chaque message sont unique

##### Date Partage d’une même file
Pour la version de partages d'un même fil, c'est la même chose que la version précédente mais cette fois si un seul client reçoit le message, tous les clients ne reçoivent donc pas tous les messages, chaque message est unique.<br>
<br>
Pour tester on a executé un EnvoyerDate, et 2 RecevoirDate pour vérifier que chaque message n'est reçu que par un seul client :
On peut donc bien voir que les messages sont partagés entre les clients
##### Date Routage simple
Dans cette version, on peut choisir une clef de routage, dans dateRoot on a donc la clef "local" et la clef "GMT" dans EnvoyerDate on envoie donc avec ses clefs respectivement, la date locale (la même que précédement), et la date GMT (la même chose mais juste a remplaçant .toString() à .toGMTString() ). On a maintenant deux receveurs, RecvoirDate, qui s'abonne à la clef "local" et RecevoirGMT qui s'abonne à la clef "GMT".<br>
La Class Recevoir reçoit bien uniquement les dates locales et RecevoirDateGMT les dates GMT
##### Date Routage par Topic
On utilise maintenant des topics, tout comme le Routage précédent on peut s'abonner à des clef, mais dans ce cas là, ce sont des chemain, par exemple au lieu d'uniquement "local" et "GMT" c'est "date.local" et "date.GMT", cette fois si les deux topic on un point commu dans leur chemain, il et donc possible de s'abonner uniquement à "local", uniquement à "GMT" ou à toutes les dates avec "date.#".<br>
RecevoirTouesDates reçoit toutes les dates comme convenu, RecevoirDate uniquement les dates locales et RecevoirDateGMT les dates GMT.
#### Chat
Ce chat utilise des topics, on pourra donc y avoir des canaux, où les clients pourront s'abonner.<br>
<br>
En s'abonnant à un canal, le client reçoit donc uniquement les messages liés à ce canal, et envoie des messages dans ce canal.
Le client commence par s'abonner au canal choisi (en 1er argument, ou "#" (tous les canaux) si pas d'argument et dans 2ème argument on peut aussi mettre un nom d'utilisateur, String random sinon), puis on entre dans la boucle pour envoyer les messages, on utilise simplement un scanner.<br>
<br>
Pour que les utilisateurs puissent s'identifier entre eux, on intègre le nom d'utilisateur dans le header des Properties de chaque message, avec la clef "sender". Le receveur doit également connaître de quel canal vient le message (pas forcément le même que lui-même dans le cas, par exemple, où l'on utilise "#")
## Faire des diagrammes
En particulier vous pouvez utiliser [mermaid](https://mermaidjs.github.io/) :
```mermaid
sequenceDiagram
participant Alice
participant Bob
Alice->John: Hello John, how are you?
loop Healthcheck
John->John: Fight against hypochondria
end
Note right of John: Rational thoughts <br/>prevail...
Pour le test, on va faire deux utilisateurs dans le même canal : Alice et Bob, un dans un canal voisin : Charlie, et un dans le canal parent aux deux précédents : David, et enfin l'Espion qui peut voir tous les canaux :<br>
(ordre des messages : Alice "Bonjour" , Bob "Salut" , David "Hello" , Charlie "je suis tout seul ?")
[*] Waiting for messages. To exit press CTRL+C<br>
Bonjour<br>
main.salon1#Alice>Bonjour<br>
main.salon1#Bob>Salut
</td>
<td>
[*] Waiting for messages. To exit press CTRL+C<br>
main.salon1#Alice>Bonjour<br>
Salut <br>
main.salon1#Bob>Salut
</td>
<td>
[*] Waiting for messages. To exit press CTRL+C<br>
je suis seul ? <br>
main.salon2#Charlie>je suis seul ?
</td>
<td>
[*] Waiting for messages. To exit press CTRL+C<br>
main.salon1#Alice>Bonjour<br>
main.salon1#Bob>Salut<br>
hello <br>
main.##David>hello<br>
main.salon2#Charlie>je suis seul ?
</td>
<td>
[*] Waiting for messages. To exit press CTRL+C<br>
main.salon1#Alice>Bonjour<br>
main.salon1#Bob>Salut<br>
main.##David>hello<br>
main.salon2#Charlie>je suis seul ?
</td>
</tr>
</tbody>
</table>
L'Espion voit tous les messages comme prévu, David (main.#) peut lire tous les messages de Alice, Bob et Charlie (et les siens). Alice et Bob voient uniquement les messages de main.salon1, et Charlie ne voit aucun autre message que le sien car il est seul dans le main.salon2.
Thread.sleep(1000);// Attend 1 seconde (1000 millisecondes)
}catch(InterruptedExceptione){
e.printStackTrace();
}
Thread.sleep(1000);// Attend 1 seconde (1000 millisecondes)
}
}
}
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.