Ministerul Educaiei al Republicii Moldova
Universitatea Tehnic a Moldovei
Catedra: Automatic i Tehnologii Informaionale
RAPORT
Lucrare de laborator Nr.1
la disciplina Programarea Aplicaiilor Distribuite
Tema: Agent de mesagerie Message Broker
A efectuat:
st. gr. SI-121
A. Gurianu
A verificat:
lect. univ.
[Link]
Chiinu 2015
Scopul lucrrii: integrarea bazat pe ageni de mesaje care ar permite o comunicare asincron dintre
componentele distribuite ale unui sistem.
Sarcina lucrrii:
Considernd brokerul o form generalizat a medierii dintre componentele distribuite, se propune
implementri ale rutrii sau construirii de mesaje n conformitate cu abloanele menionate de
Gregor Hohpe n [3], care sunt grupate n cteva seciuni:
a. Messaging Systems,
b. Messaging Channels,
c. Message Constructions,
d. Message Routing,
e. Message Transformation,
f. Messaging endpoints,
g. System management.
Implementare:
La efectuarea acestului laborator, am implementat un sistem de tip mesagerie instantanee. Sistemul
are urmatoarea structur:
Aplicaia Web
Repositories
Domain Models
Services
Infrastructure
Broker
MongoDB
Fig.1 Structura sistemului
1. Message Channel (Messaging Systems)
n cadrul sistemului aplicaiile web comunic cu Broker-ul. Broker-ul poate primit mesaje de la
utilizatori i transmite mesaje destinatarilor, astfel el reprezint un mediator ntre diferii utilizatori ai
sistemului.
2. Message Translator (Messaging Systems)
n cadrul sistemului se efectuiaz translarea mesajelor. Broker-ul primete/transmite mesaje de tip
Json i le salveaz n baza de date n formatul Bson, specific SGBD MongoDB.
3. Publish-Subscribe Channel (Messaging Channels)
Utilizatorii sunt notificai despre mesajele noi pe care le primesc de la ali utilizatori, precum i
notificai despre faptul, c au cereri de prietenie din partea altor utilizatori.
4. Dead Letter Channel (Messaging Channels)
Toate mesajele din cadrul sistemului, precum i cererile de prietenie sunt salvate n baza de date,
respectiv n cadrul sistemului nu exist pierderi de mesaje.
5. Correlation Identifier (Message Construction)
Utiliznd numele de utilizator n cadrul sistemului, entitile sunt identificate. Atunci cnd utilizatorii
se autentific, acetea sunt salvai ntro colecie special de date, care conine att numele ct i id-ul de
conexiune din cadrul Hub-ului.
6. Content-Based Router (Message Routing)
n dependen de cmpul mesajului ConectionID, mesajul poate fi transmis ctre un unic utilizator
i salvat n baza de date sau transmis tuturor utilizatorilor online.
7. Content Enricher (Message Transformation)
La autentificarea n sistem, utilizatorilor le sunt transmise datele privind lista de prieteni i mai apoi
doar sunt transmise, la dorin i mesajele din conversaia dorit.
Codul surs BrokerHub:
using
using
using
using
using
using
using
using
using
using
using
System;
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
namespace Broker
{
[HubName("brokerHub")]
public class BrokerHub : Hub
{
private readonly [Link] userManager;
private readonly [Link]
authenticationManager;
private readonly [Link] activeUserManager;
private readonly [Link] friendRequestManager;
private readonly [Link] conversationManager;
public BrokerHub()
{
userManager = new [Link]();
authenticationManager = new [Link]();
activeUserManager = new [Link]();
friendRequestManager = new [Link]();
conversationManager = new [Link]();
}
public void Send(ChatMessage message)
{
if ([Link] == null)
{
[Link]([Link], [Link]);
}
else
{
[Link]([Link], new Message
{
Sender = [Link],
Text = [Link]
});
ActiveUser user = [Link]([Link]);
if (user != null)
{
[Link]([Link]).addMessage([Link], [Link],
[Link]);
[Link]([Link], [Link], [Link]);
}
}
}
public void GetFriendsList(string user)
{
[Link]();
}
public void AddFriend(FriendRequest request)
{
if ([Link] == [Link])
{
[Link](request);
ActiveUser user = [Link]([Link]);
if (user != null)
{
[Link]([Link]).recievePendingUsersList( new
FriendRequest[]{request});
}
}
else
{
[Link](request);
Friend friend = new Friend()
{
Name = [Link],
ConversationID = [Link]()
};
[Link]([Link], friend);
[Link]([Link], new Friend
{
ConversationID = [Link],
Name = [Link]
});
[Link](new Conversation
{
ID = [Link]
});
}
}
public void LogIn(string user, string password)
{
bool isValidUser = [Link](new UserCredentials
{
UserName = user,
Password = password
});
if (isValidUser)
{
[Link]([Link](user));
[Link](new [Link]()
{
UserName = user,
ConnectionID = [Link]
});
[Link]([Link](user).ToArray());
}
}
public void LogOut(string user)
{
[Link](user);
}
public void Register(User user)
{
[Link](user);
}
public void SearchUsers(string key)
{
User[] users = [Link](key);
ActiveUser currentUser = [Link]([Link]);
[Link]([Link](x => [Link] != [Link]));
}
public void GetMessages(Guid conversationID, int messageNumber)
{
List<Message> messages = [Link](conversationID, messageNumber);
[Link](conversationID, messages);
}
public override [Link] OnDisconnected(bool stopCalled)
{
ActiveUser user = [Link]([Link]);
[Link]([Link]);
return [Link](stopCalled);
}
}
}
Rezultatele afirii:
Fig.2 Pagina de autentificare
Fig.3 Pagina cu mesaje
Fig.4 Pagina de adugare a prietenilor
Concluzie:
n urma efecturii aceste lucrri de laborator am implementat un Broker, care
are funcia de asigurare a comunicaiei ntre utilizatorii sistemului. Am utilizat o baz de date
MongoDB pentru a stoca datele persistent n formatul de date Bson. Am implementat toate 7
abloane enumerate n condiie.
Bibliografie:
1. Sean Chambers, Simone Chimoretta, 31 days refactoring [ Resurs electronic].-Regim de acces:
[Link]
2. Tony Northgroup, [Link] Framework Application Development Foundation 2nd edition ,
Library of Congress Control Number: 2008935429;
3. Kristina Cbodorow, 50 Tips & tricks for MongoDB Developers,
ISBM: 978-1-449-30461-4;
4. [Link] - maparea
utilizatorilor la conexiunile existente cu pstrare persistent.