This shows you the differences between two versions of the page.
isi:laboratoare:07 [2024/11/17 22:24] alexandru.predescu |
isi:laboratoare:07 [2024/11/21 11:04] (current) sorin.ciolofan |
||
---|---|---|---|
Line 270: | Line 270: | ||
3. **Chat interactiv** | 3. **Chat interactiv** | ||
+ | |||
+ | Această aplicație presupune un server Flask care interacționează cu RabbitMQ și expune o interfață web pentru utilizator. | ||
**Implementare:** Pornind de la codul pentru această aplicație de mesagerie, implementează funcționalitățile necesare, marcate cu TODO-uri in fisierul ''message_service.py'', pentru ca aceasta să funcționeze complet: | **Implementare:** Pornind de la codul pentru această aplicație de mesagerie, implementează funcționalitățile necesare, marcate cu TODO-uri in fisierul ''message_service.py'', pentru ca aceasta să funcționeze complet: | ||
Line 276: | Line 278: | ||
* TODO b) Consumă mesajele care sosesc pe queue-ul tău. Adaugă un `consumer_tag` cu numele queue-ului, astfel încât consumatorul să nu mai asculte la acest queue atunci când utilizatorul se deconectează (logout). | * TODO b) Consumă mesajele care sosesc pe queue-ul tău. Adaugă un `consumer_tag` cu numele queue-ului, astfel încât consumatorul să nu mai asculte la acest queue atunci când utilizatorul se deconectează (logout). | ||
* TODO c) Implementează trimiterea unui mesaj către un anumit utilizator pentru a putea iniția o conversație privată cu acesta. | * TODO c) Implementează trimiterea unui mesaj către un anumit utilizator pentru a putea iniția o conversație privată cu acesta. | ||
+ | |||
+ | <note tip> | ||
+ | |||
+ | Folosește instanța locală și rulează scriptul ''initialize.py'' din laborator, care configurează 3 utilizatori: **stefan**, **alex** și **maria**. | ||
+ | |||
+ | **Testare**: Pentru a testa aplicația, puteți rula două instanțe ale aplicației pe porturi diferite, pentru a simula doi utilizatori care folosesc aplicația pe dispozitive diferite. În cadrul testării, punctul a) poate fi verificat individual, iar punctele b) și c) vor fi testate împreună. | ||
+ | |||
+ | Pentru a rula aplicația, folosește comanda: ''python app.py'' sau ''flask run''. | ||
+ | |||
+ | Aceasta va rula implicit pe portul 5000, iar pentru a vizualiza interfața pusă la dispoziție de aceasta, deschideți [[http://localhost:5000|]]. | ||
+ | |||
+ | Pentru a rula aplicația pe un alt port decât cel implicit, rulați ''flask run <nowiki>--</nowiki>port 5001''. | ||
+ | </note> | ||
**Testare:** | **Testare:** | ||
* Testează funcționalitatea pentru a verifica dacă poți comunica cu un alt utilizator (folosind două instanțe locale de aplicație). | * Testează funcționalitatea pentru a verifica dacă poți comunica cu un alt utilizator (folosind două instanțe locale de aplicație). | ||
- | * Schimbă conexiunea la RabbitMQ cu următoarea și testează dacă poți conversa cu alți colegi. | + | * Schimbă conexiunea la RabbitMQ cu următoarea și testează dacă poți conversa cu alți colegi: |
<code> | <code> | ||
Line 287: | Line 302: | ||
Parola: întreabă coordonatorul de laborator | Parola: întreabă coordonatorul de laborator | ||
</code> | </code> | ||
- | |||
- | <note tip> | ||
- | **Testare**: Pentru a testa aplicația, puteți rula două instanțe ale aplicației pe porturi diferite, pentru a simula doi utilizatori care folosesc aplicația pe dispozitive diferite. În cadrul testării, punctul a) poate fi verificat individual, iar punctele b) și c) vor fi testate împreună. | ||
- | |||
- | Pentru a rula aplicația, folosește comanda: ''python app.py'' sau ''flask run''. | ||
- | Aceasta va rula implicit pe portul 5000, iar pentru a vizualiza interfața pusă la dispoziție de aceasta, deschideți [[http://localhost:5000|]]. | ||
- | |||
- | Pentru a rula aplicația pe un alt port decât cel implicit, rulați ''flask run --port 5001''. | ||
- | </note> | ||
<note important> | <note important> | ||
- | În cadrul acestui exercițiu, nu vei declara queue-uri sau exchange-uri, deoarece acestea sunt deja create. Până să te conectezi la instanța din cloud, folosește instanța locală și rulează scriptul ''initialize.py'' din laborator, care configurează 3 utilizatori: **stefan**, **alex** și **maria**. | + | În cadrul acestui exercițiu, nu vei declara queue-uri sau exchange-uri, deoarece acestea sunt deja create pe instanța din cloud. |
- | </note> | + | |
- | <note tip>**Important**: Când te conectezi la instanța din cloud, utilizatorii vor avea formatul ''nume_prenume_grupa''. Dacă nu ești sigur care este utilizatorul pregătit pentru tine, conectează-te la: | + | **Important**: Când te conectezi la instanța din cloud, utilizatorii vor avea formatul ''nume_prenume_grupa''. Dacă nu ești sigur care este utilizatorul pregătit pentru tine, conectează-te la: |
[[http://acc-atomicsoftware.swedencentral.cloudapp.azure.com:15672]] | [[http://acc-atomicsoftware.swedencentral.cloudapp.azure.com:15672]] | ||
cu utilizatorul si parola de mai sus și caută în tab-ul //Queues and Streams// după numele tău. Queue-ul o să se numească //chatUser.username//, iar tu trebuie să folosești doar //username// pentru a te conecta. În situația în care totuși nu te regăsești, poți folosi unul dintre utilizatorii următori: //bob//, //alice//, //stefan//, //alex//.</note> | cu utilizatorul si parola de mai sus și caută în tab-ul //Queues and Streams// după numele tău. Queue-ul o să se numească //chatUser.username//, iar tu trebuie să folosești doar //username// pentru a te conecta. În situația în care totuși nu te regăsești, poți folosi unul dintre utilizatorii următori: //bob//, //alice//, //stefan//, //alex//.</note> | ||
+ | |||
+ | <note important> | ||
+ | În situația în care întâmpinați o eroare similară cu "connection lost" sau "unable to pop from an empty queue" atunci când începeți să consumați mesaje, este indicat să adăugați o metodă nouă pentru a crea un channel și să utilizați un channel nou creat atunci când începeți să ascultați. | ||
+ | |||
+ | <code> | ||
+ | def getChannel(self): | ||
+ | connection = pika.BlockingConnection(self.connection_params) | ||
+ | return connection.channel() | ||
+ | </code> | ||
+ | </note> | ||
**Diagrame explicative ale exercițiului 3:** | **Diagrame explicative ale exercițiului 3:** | ||
+ | <spoiler> | ||
{{:isi:laboratoare:general-architecture.jpg?400|}} | {{:isi:laboratoare:general-architecture.jpg?400|}} | ||
Line 315: | Line 331: | ||
{{:isi:laboratoare:rabbitmq-send-message.jpg?500|}} | {{:isi:laboratoare:rabbitmq-send-message.jpg?500|}} | ||
+ | </spoiler> | ||