Documente Academic
Documente Profesional
Documente Cultură
RAPORT
Lucrare de laborator Nr.1
la disciplina Programarea Aplicaiilor Distribuite
Tema: Agent de mesagerie Message Broker
A efectuat:
A verificat:
lect. univ.
I.Antohi
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
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;
System.Collections.Generic;
System.Linq;
Chat.Managers.FriendRequest;
Chat.Managers.Interface.AuthenticationManager;
Microsoft.AspNet.SignalR;
Microsoft.AspNet.SignalR.Hubs;
Models.ActiveUser;
Models.Conversation;
Models.FriendRequest;
Models.User;
namespace Broker
{
[HubName("brokerHub")]
public class BrokerHub : Hub
{
private readonly Chat.Managers.Interface.UserManager.IManager userManager;
private readonly Chat.Managers.Interface.AuthenticationManager.IManager
authenticationManager;
private readonly Chat.Managers.Interface.ActiveUserManager.IManager activeUserManager;
private readonly Chat.Managers.Interface.FriendRequest.IManager friendRequestManager;
private readonly Chat.Managers.Interface.Conversation.IManager conversationManager;
public BrokerHub()
{
userManager = new Chat.Managers.UserManager.Manager();
authenticationManager = new Chat.Managers.AuthenticationManager.Manager();
activeUserManager = new Chat.Managers.ActiveUserManager.Manager();
friendRequestManager = new Chat.Managers.FriendRequest.Manager();
conversationManager = new Chat.Managers.Conversation.Manager();
}
public void Send(ChatMessage message)
{
if (message.ConversationID == null)
{
Clients.All.addMessage(message.Sender, message.Text);
}
else
{
conversationManager.AddMessage(message.ConversationID.Value, new Message
{
Sender = message.Sender,
Text = message.Text
});
ActiveUser user = activeUserManager.FindBy(message.Receiver);
if (user != null)
{
Clients.Client(user.ConnectionID).addMessage(message.Sender, message.Text,
message.ConversationID);
Clients.Caller.recievePendingUsersList(friendRequestManager.FindBy(user).ToArray());
}
}
public void LogOut(string user)
{
activeUserManager.Remove(user);
}
public void Register(User user)
{
userManager.Register(user);
}
public void SearchUsers(string key)
{
User[] users = userManager.Search(key);
ActiveUser currentUser = activeUserManager.GetBy(Context.ConnectionId);
Clients.Caller.recieveUsersList(users.Where(x => x.UserName != currentUser.UserName));
}
public void GetMessages(Guid conversationID, int messageNumber)
{
List<Message> messages = conversationManager.GetMessages(conversationID, messageNumber);
Clients.Caller.receiveOldMessages(conversationID, messages);
}
public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
{
ActiveUser user = activeUserManager.GetBy(Context.ConnectionId);
activeUserManager.Remove(user.UserName);
return base.OnDisconnected(stopCalled);
}
}
}
Rezultatele afirii:
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:
http://lostechies.com/wp-content/uploads/2011/03/31DaysRefactoring.pdf;
2. Tony Northgroup, Microsoft.NET 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. http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections - maparea
utilizatorilor la conexiunile existente cu pstrare persistent.