public static Message DeserialiseMsg(RemoteMessageDTO msg, ProcessId actorId) { var sender = String.IsNullOrEmpty(msg.Sender) ? ProcessId.NoSender : new ProcessId(msg.Sender); var replyTo = String.IsNullOrEmpty(msg.ReplyTo) ? ProcessId.NoSender : new ProcessId(msg.ReplyTo); switch ((Message.TagSpec)msg.Tag) { case Message.TagSpec.UserReply: var content = DeserialiseMsgContent(msg); return new ActorResponse(content, content.GetType().AssemblyQualifiedName, actorId, sender, msg.RequestId, msg.Exception == "RESPERR"); case Message.TagSpec.UserAsk: return new ActorRequest(DeserialiseMsgContent(msg), actorId, replyTo, msg.RequestId); case Message.TagSpec.User: return new UserMessage(DeserialiseMsgContent(msg), sender, replyTo); case Message.TagSpec.UserTerminated: return (TerminatedMessage)DeserialiseMsgContent(msg); case Message.TagSpec.GetChildren: return UserControlMessage.GetChildren; case Message.TagSpec.StartupProcess: return SystemMessage.StartupProcess; case Message.TagSpec.ShutdownProcess: return (ShutdownProcessMessage)DeserialiseMsgContent(msg); case Message.TagSpec.Restart: return SystemMessage.Restart; case Message.TagSpec.Pause: return SystemMessage.Pause; case Message.TagSpec.Unpause: return SystemMessage.Unpause; case Message.TagSpec.DispatchWatch: return (SystemDispatchWatchMessage)DeserialiseMsgContent(msg); case Message.TagSpec.DispatchUnWatch: return (SystemDispatchUnWatchMessage)DeserialiseMsgContent(msg); case Message.TagSpec.Watch: return (SystemAddWatcherMessage)DeserialiseMsgContent(msg); case Message.TagSpec.UnWatch: return (SystemRemoveWatcherMessage)DeserialiseMsgContent(msg); } throw new Exception($"Unknown Message Tag: {msg.Tag}"); }
public Unit TellSystem(SystemMessage message, ProcessId sender) { var dto = RemoteMessageDTO.Create(message, ProcessId, sender, Message.Type.System, message.Tag); var clientsReached = Cluster.PublishToChannel(ActorInboxCommon.ClusterSystemInboxNotifyKey(ProcessId), dto); return(unit); }
static RemoteMessageDTO FixupPathsSystemPrefix(RemoteMessageDTO dto, SystemName system) { if (dto == null) return null; // Fix up the paths so we know what system they belong to. dto.ReplyTo = String.IsNullOrEmpty(dto.ReplyTo) || dto.ReplyTo.StartsWith("//") ? dto.ReplyTo : $"//{system}{dto.ReplyTo}"; dto.Sender = String.IsNullOrEmpty(dto.Sender) || dto.Sender.StartsWith("//") ? dto.Sender : $"//{system}{dto.Sender}"; dto.To = String.IsNullOrEmpty(dto.To) || dto.To.StartsWith("//") ? dto.To : $"//{system}{dto.To}"; return dto; }
Unit Tell(object message, ProcessId sender, string inbox, Message.Type type, Message.TagSpec tag) { var dto = RemoteMessageDTO.Create(message, ProcessId, sender, type, tag); // The standard structure for remote js relay paths are "/root/js/{connection-id}/..." var connectionId = ProcessId.Skip(2).Take(1).Name.Value; dto.To = ProcessId.Skip(3).Path; var relayMsg = new OutboundRelayMsg(connectionId, dto, dto.To, sender, dto.RequestId != -1); return(Process.tell(RelayId, relayMsg, sender)); }
public Unit Tell(object message, ProcessId sender, string inbox, Message.Type type, Message.TagSpec tag) { var dto = RemoteMessageDTO.Create(message, ProcessId, sender, type, tag); var inboxKey = ActorInboxCommon.ClusterInboxKey(ProcessId, inbox); var inboxNotifyKey = ActorInboxCommon.ClusterInboxNotifyKey(ProcessId, inbox); Cluster.Enqueue(inboxKey, dto); long clientsReached = Cluster.PublishToChannel(inboxNotifyKey, dto.MessageId); return(unit); }
static RemoteMessageDTO FixupPathsSystemPrefix(RemoteMessageDTO dto, SystemName system) { if (dto == null) { return(null); } // Fix up the paths so we know what system they belong to. dto.ReplyTo = String.IsNullOrEmpty(dto.ReplyTo) || dto.ReplyTo.StartsWith("//") ? dto.ReplyTo : $"//{system}{dto.ReplyTo}"; dto.Sender = String.IsNullOrEmpty(dto.Sender) || dto.Sender.StartsWith("//") ? dto.Sender : $"//{system}{dto.Sender}"; dto.To = String.IsNullOrEmpty(dto.To) || dto.To.StartsWith("//") ? dto.To : $"//{system}{dto.To}"; return(dto); }
public static Option <Tuple <RemoteMessageDTO, Message> > GetNextMessage(ICluster cluster, ProcessId self, string key) { if (cluster == null) { return(None); } Message msg = null; RemoteMessageDTO dto = null; dto = null; do { dto = cluster.Peek <RemoteMessageDTO>(key); if (dto == null) { // Queue is empty return(None); } if (dto.Tag == 0 && dto.Type == 0) { // Message is bad cluster.Dequeue <RemoteMessageDTO>(key); tell(ActorContext.System(self).DeadLetters, DeadLetter.create(dto.Sender, self, null, "Failed to deserialise message: ", dto)); if (cluster.QueueLength(key) == 0) { return(None); } } }while (dto == null || dto.Tag == 0 || dto.Type == 0); try { msg = MessageSerialiser.DeserialiseMsg(dto, self); msg.SessionId = dto.SessionId; } catch (Exception e) { // Message can't be deserialised cluster.Dequeue <RemoteMessageDTO>(key); tell(ActorContext.System(self).DeadLetters, DeadLetter.create(dto.Sender, self, e, "Failed to deserialise message: ", msg)); return(None); } return(Some(Tuple(dto, msg))); }
public static Message DeserialiseMsg(RemoteMessageDTO msg, ProcessId actorId) { var sys = actorId.System; msg = FixupPathsSystemPrefix(msg, sys); var sender = String.IsNullOrEmpty(msg.Sender) ? ProcessId.NoSender : new ProcessId(msg.Sender); var replyTo = String.IsNullOrEmpty(msg.ReplyTo) ? ProcessId.NoSender : new ProcessId(msg.ReplyTo); switch ((Message.TagSpec)msg.Tag) { case Message.TagSpec.UserReply: var content = DeserialiseMsgContent(msg); return(new ActorResponse(content, content.GetType().AssemblyQualifiedName, actorId, sender, msg.RequestId, msg.Exception == "RESPERR")); case Message.TagSpec.UserAsk: return(new ActorRequest(DeserialiseMsgContent(msg), actorId, replyTo.SetSystem(sys), msg.RequestId)); case Message.TagSpec.User: return(new UserMessage(DeserialiseMsgContent(msg), sender.SetSystem(sys), replyTo.SetSystem(sys))); case Message.TagSpec.UserTerminated: return(((TerminatedMessage)DeserialiseMsgContent(msg)).SetSystem(sys)); case Message.TagSpec.GetChildren: return(UserControlMessage.GetChildren); case Message.TagSpec.StartupProcess: return(SystemMessage.StartupProcess); case Message.TagSpec.ShutdownProcess: return((ShutdownProcessMessage)DeserialiseMsgContent(msg)); case Message.TagSpec.Restart: return(SystemMessage.Restart); case Message.TagSpec.Pause: return(SystemMessage.Pause); case Message.TagSpec.Unpause: return(SystemMessage.Unpause); case Message.TagSpec.DispatchWatch: return((SystemDispatchWatchMessage)DeserialiseMsgContent(msg)); case Message.TagSpec.DispatchUnWatch: return((SystemDispatchUnWatchMessage)DeserialiseMsgContent(msg)); case Message.TagSpec.Watch: return((SystemAddWatcherMessage)DeserialiseMsgContent(msg)); case Message.TagSpec.UnWatch: return((SystemRemoveWatcherMessage)DeserialiseMsgContent(msg)); } throw new Exception($"Unknown Message Tag: {msg.Tag}"); }
private static object DeserialiseMsgContent(RemoteMessageDTO msg) { object content = null; if (msg.Content == null) { throw new Exception($"Message content is null from {msg.Sender}"); } else { var contentType = Type.GetType(msg.ContentType); if (contentType == null) { throw new Exception($"Can't resolve type: {msg.ContentType}"); } content = JsonConvert.DeserializeObject(msg.Content, contentType); } return(content); }
private static object DeserialiseMsgContent(RemoteMessageDTO msg) { object content = null; if (msg.Content == null) { throw new Exception($"Message content is null from {msg.Sender}"); } else { var contentType = Type.GetType(msg.ContentType); if (contentType == null) { throw new Exception($"Can't resolve type: {msg.ContentType}"); } content = JsonConvert.DeserializeObject(msg.Content, contentType); } return content; }
/// <summary> /// TODO: This is a combination of code in ActorCommon.GetNextMessage and /// CheckRemoteInbox. Some factoring is needed. /// </summary> void SysInbox(RemoteMessageDTO dto) { try { if (dto == null) { // Failed to deserialise properly return; } if (dto.Tag == 0 && dto.Type == 0) { // Message is bad tell(ActorContext.System(actor.Id).DeadLetters, DeadLetter.create(dto.Sender, actor.Id, null, "Failed to deserialise message: ", dto)); return; } var msg = MessageSerialiser.DeserialiseMsg(dto, actor.Id); try { lock (sync) { ActorInboxCommon.SystemMessageInbox(actor, this, (SystemMessage)msg, parent); } } catch (Exception e) { var session = msg.SessionId == null ? None : Some(new SessionId(msg.SessionId)); ActorContext.System(actor.Id).WithContext(new ActorItem(actor, this, actor.Flags), parent, dto.Sender, msg as ActorRequest, msg, session, () => replyErrorIfAsked(e)); tell(ActorContext.System(actor.Id).DeadLetters, DeadLetter.create(dto.Sender, actor.Id, e, "Remote message inbox.", msg)); logSysErr(e); } } catch (Exception e) { logSysErr(e); } }
public static Message DeserialiseMsg(RemoteMessageDTO msg, ProcessId actorId) { var sender = String.IsNullOrEmpty(msg.Sender) ? ProcessId.NoSender : new ProcessId(msg.Sender); var replyTo = String.IsNullOrEmpty(msg.ReplyTo) ? ProcessId.NoSender : new ProcessId(msg.ReplyTo); switch ((Message.TagSpec)msg.Tag) { case Message.TagSpec.UserReply: var content = DeserialiseMsgContent(msg); return new ActorResponse(content, content.GetType().AssemblyQualifiedName, actorId, sender, msg.RequestId, msg.Exception == "RESPERR"); case Message.TagSpec.UserAsk: return new ActorRequest(DeserialiseMsgContent(msg), actorId, replyTo, msg.RequestId); case Message.TagSpec.User: return new UserMessage(DeserialiseMsgContent(msg), sender, replyTo); case Message.TagSpec.GetChildren: return UserControlMessage.GetChildren; case Message.TagSpec.ShutdownProcess: return SystemMessage.ShutdownProcess; case Message.TagSpec.Restart: return SystemMessage.Restart; } throw new Exception("Unknown Message Type: " + msg.Type); }
public static Message DeserialiseMsg(RemoteMessageDTO msg, ProcessId actorId) { var sender = String.IsNullOrEmpty(msg.Sender) ? ProcessId.NoSender : new ProcessId(msg.Sender); var replyTo = String.IsNullOrEmpty(msg.ReplyTo) ? ProcessId.NoSender : new ProcessId(msg.ReplyTo); switch ((Message.TagSpec)msg.Tag) { case Message.TagSpec.UserReply: var content = DeserialiseMsgContent(msg); return(new ActorResponse(content, content.GetType().AssemblyQualifiedName, actorId, sender, msg.RequestId, msg.Exception == "RESPERR")); case Message.TagSpec.UserAsk: return(new ActorRequest(DeserialiseMsgContent(msg), actorId, replyTo, msg.RequestId)); case Message.TagSpec.User: return(new UserMessage(DeserialiseMsgContent(msg), sender, replyTo)); case Message.TagSpec.GetChildren: return(UserControlMessage.GetChildren); case Message.TagSpec.ShutdownProcess: return(SystemMessage.ShutdownProcess); case Message.TagSpec.Restart: return(SystemMessage.Restart); } throw new Exception("Unknown Message Type: " + msg.Type); }
public OutboundRelayMsg(string connectionId, RemoteMessageDTO msg, ProcessId to, ProcessId sender, bool isAsk) : base(MsgTag.Outbound, connectionId, to, sender, isAsk) { Message = msg; }