/// <summary> /// Receive accept message /// </summary> /// <param name="agentMessage">Accepted message</param> private void AcceptTask(AgentMessage agentMessage) { int cost = CalcCost(agentMessage.Text); int index = _taskedAgent.FindIndex(a => a.Subject == agentMessage.Subject); if (index >= 0) { int oldCost = CalcCost(_taskedAgent[index].Text); if (oldCost > cost) _taskedAgent[index] = agentMessage; } else { int startIndex = agentMessage.Text.IndexOf('[') + 1; int endIndex = agentMessage.Text.IndexOf(']'); string newTask = agentMessage.Text.Substring(startIndex, endIndex - startIndex); AgentMessage msg = agentMessage; msg.Subject = newTask; _taskedAgent.Add(msg); } if (CheckCompleteAllTasks()) { _agent.AcceptMessage(_acceptedAgent, _acceptedTask); } }
/// <summary> /// Send message to another agent /// </summary> /// <param name="receiverAgent">Receiver agent</param> /// <param name="message">Message</param> public void SendMessage(string receiverAgent, AgentMessage message) { string pathAgent = _prefixPath + receiverAgent; MessageQueue mq; if (MessageQueue.Exists(pathAgent)) mq = new MessageQueue(pathAgent); else mq = MessageQueue.Create(pathAgent); AgentMessage sendedMessage = new AgentMessage() { MessageType = message.MessageType, SenderAgent = _pathService, Subject = message.Subject, Text = message.Text, Owner = message.Owner }; //message.SenderAgent = _pathService; mq.Send(sendedMessage); }
/// <summary> /// Constructor /// </summary> /// <param name="agentMessage">Message</param> public AgentMessageEventArgs(AgentMessage agentMessage) { AgentMessage = agentMessage; }
/// <summary> /// Write message to Log list /// </summary> /// <param name="agentMessage">AgentMessage</param> private void WriteMessageToLogList(AgentMessage agentMessage) { string msg = "[" + agentMessage.SenderAgent + "]"; if (agentMessage.MessageType == MessageType.Subscribe) msg += " +" + agentMessage.Subject; else if (agentMessage.MessageType == MessageType.Unsubscribe) msg += " -" + agentMessage.Subject; else if (agentMessage.MessageType == MessageType.Hello) msg += " Установлено соединение с " + agentMessage.SenderAgent; else if (agentMessage.MessageType == MessageType.Bye) msg += " Закрыто соединение с " + agentMessage.SenderAgent; //msg += agentMessage.Subject; if (agentMessage.MessageType == MessageType.Message) { msg += " : "; msg += agentMessage.Text; } InvokeWriteToLog(msg); }
/// <summary> /// Unsubscrie if need /// </summary> /// <param name="message">Message</param> private void UnsubscribeIfNeed(AgentMessage message) { List<string> outList; if (!_routingTable.TryGetValue(message.Subject, out outList)) { if (!_subscribed.Exists(s => s == message.Subject)) { AgentMessage msg = new AgentMessage() { MessageType = MessageType.Unsubscribe, SenderAgent = AgentName, Subject = message.Subject }; _messageService.SendMessage(message.SenderAgent, msg); } } }
/// <summary> /// Send all subscribe to near agent /// </summary> /// <param name="nearAgent">Name of the near agent</param> private void SubscribeAll(string nearAgent) { foreach (var route in _routingTable) { AgentMessage msg = new AgentMessage() { MessageType = MessageType.Subscribe, SenderAgent = AgentName, Subject = route.Key }; _messageService.SendMessage(nearAgent, msg); } foreach (var sub in _subscribed) { AgentMessage msg = new AgentMessage() { MessageType = MessageType.Subscribe, SenderAgent = AgentName, Subject = sub }; _messageService.SendMessage(nearAgent, msg); } }
/// <summary> /// Send message to near agents /// </summary> /// <param name="message"></param> private void SendMessageToNearAgents(AgentMessage message) { foreach (var agent in _nearAgents) { if (agent != message.SenderAgent) _messageService.SendMessage(agent, message); } }
/// <summary> /// Send message into route table /// </summary> /// <param name="message">Message</param> private void SendMessageIntoRouteTable(AgentMessage message) { List<string> outList; if (_routingTable.TryGetValue(message.Subject, out outList)) { foreach (var agent in outList) { if (agent != message.SenderAgent) _messageService.SendMessage(agent, message); } } }
/// <summary> /// Receive message if this agent subscribed on input message /// </summary> /// <param name="message">Message</param> private void ReceiveMessageIfNeed(AgentMessage message) { if (_subscribed.Exists(s => s == message.Subject)) { #if !DEBUG ReceiveMessageEvent(new AgentMessageEventArgs(message)); #endif } }
/// <summary> /// Receivee message /// </summary> /// <param name="message">Message</param> private void ReceiveMessage(AgentMessage message) { #if DEBUG ReceiveMessageEvent(new AgentMessageEventArgs(message)); #endif switch (message.MessageType) { case MessageType.Message: UnsubscribeIfNeed(message); ReceiveMessageIfNeed(message); SendMessageIntoRouteTable(message); break; case MessageType.Subscribe: AddNearAgentIfNotExists(message.SenderAgent); AddRoute(message.SenderAgent, message.Subject); SendMessageToNearAgents(message); break; case MessageType.Unsubscribe: RemoveRoute(message.SenderAgent, message.Subject); //SendMessageToNearAgents(message); break; case MessageType.Hello: AddNearAgentIfNotExists(message.SenderAgent); //SubscribeAll(message.SenderAgent); break; case MessageType.Bye: RemoveAgentFromRoutingTable(message.SenderAgent); _nearAgents.Remove(message.SenderAgent); //RemoveNearAgent(message.SenderAgent); break; } }
/// <summary> /// Unsubscribe /// </summary> /// <param name="subject">Subject</param> public void Unsubscribe(string subject) { if (_subscribed.Exists(s => s == subject)) { _subscribed.Remove(subject); AgentMessage msg = new AgentMessage() { MessageType = MessageType.Unsubscribe, SenderAgent = AgentName, Subject = subject }; SendMessageToNearAgents(msg); } }
/// <summary> /// Remove near agent /// </summary> /// <param name="nearAgent">Name of the near agent</param> public void RemoveNearAgent(string nearAgent) { if (_nearAgents.Exists(a => a == nearAgent)) { _nearAgents.Remove(nearAgent); AgentMessage msg = new AgentMessage() { MessageType = MessageType.Bye, SenderAgent = AgentName }; _messageService.SendMessage(nearAgent, msg); RemoveAgentFromRoutingTable(nearAgent); } }
/// <summary> /// Publish /// </summary> /// <param name="subject">Subject</param> /// <param name="text">Text</param> public void Publish(string subject, string text) { AgentMessage msg = new AgentMessage() { MessageType = MessageType.Message, SenderAgent = AgentName, Subject = subject, Text = text, Owner = AgentName }; SendMessageIntoRouteTable(msg); }
/// <summary> /// Add near agent /// </summary> /// <param name="nearAgent">Name of the near agent</param> public void AddNearAgent(string nearAgent) { if (!_nearAgents.Exists(a => a == nearAgent)) { _nearAgents.Add(nearAgent); AgentMessage msg = new AgentMessage() { MessageType = MessageType.Hello, SenderAgent = AgentName }; _messageService.SendMessage(nearAgent, msg); SubscribeAll(nearAgent); } }
/// <summary> /// Write message to log list /// </summary> /// <param name="agentMessage">Agent message</param> private void WriteMessageToLogList(AgentMessage agentMessage) { string msg = "[" + agentMessage.SenderAgent + "]"; if (agentMessage.MessageType == MessageType.Subscribe) msg += " +" + agentMessage.Subject; else if (agentMessage.MessageType == MessageType.Unsubscribe) msg += " -" + agentMessage.Subject; else if (agentMessage.MessageType == MessageType.Hello) msg += " Установлено соединение с " + agentMessage.SenderAgent; else if (agentMessage.MessageType == MessageType.Bye) msg += " Закрыто соединение с " + agentMessage.SenderAgent; //msg += agentMessage.Subject; if (agentMessage.MessageType == MessageType.Message) { msg += " : "; msg += agentMessage.Text; } if (lbLog.InvokeRequired) { AddStringToListBox d = new AddStringToListBox((text) => { InvokeReceiveMessage(text); }); this.Invoke(d, new object[] { msg }); } else { InvokeReceiveMessage(msg); } }