public Unit TellUserControl(UserControlMessage msg)
        {
            if (msg == null)
            {
                throw new ArgumentNullException(nameof(msg));
            }

            if (userInbox != null)
            {
                if (IsPaused)
                {
                    new ActorDispatchRemote(ActorContext.System(actor.Id).Ping, actor.Id, cluster, ActorContext.SessionId, false).TellUserControl(msg, ProcessId.None);
                }
                else
                {
                    try
                    {
                        userInbox.Post(msg);
                    }
                    catch (QueueFullException)
                    {
                        throw new ProcessInboxFullException(actor.Id, MailboxSize, "user");
                    }
                }
            }
            return(unit);
        }
Exemple #2
0
        public Unit TellUserControl(UserControlMessage message, ProcessId sender)
        {
            var sessionId = ActorContext.SessionId;

            return(transactionalIO
                ? ProcessOp.IO(() => Inbox.TellUserControl(message, sessionId))
                : Inbox.TellUserControl(message, sessionId));
        }
Exemple #3
0
        public static Option <UserControlMessage> PreProcessMessage <T>(ProcessId sender, ProcessId self, object message, Option <SessionId> sessionId)
        {
            if (message == null)
            {
                var emsg = $"Message is null for tell (expected {typeof(T)})";
                tell(ActorContext.System(self).DeadLetters, DeadLetter.create(sender, self, emsg, message));
                return(None);
            }

            UserControlMessage rmsg = null;

            if (message is ActorRequest req)
            {
                if (!(req.Message is T) && !(req.Message is Message))
                {
                    var emsg = $"Invalid message type for ask (expected {typeof(T)})";
                    tell(ActorContext.System(self).DeadLetters, DeadLetter.create(sender, self, emsg, message));

                    ActorContext.System(self).Tell(
                        sender,
                        new ActorResponse(new Exception($"Invalid message type for ask (expected {typeof(T)})"),
                                          sender,
                                          self,
                                          req.RequestId,
                                          typeof(Exception).AssemblyQualifiedName,
                                          true
                                          ),
                        Schedule.Immediate,
                        self
                        );

                    return(None);
                }
                rmsg = message as UserControlMessage;
            }
            else
            {
                rmsg = new UserMessage(message, sender, sender);
            }

            if (rmsg != null && rmsg.SessionId == null && sessionId.IsSome)
            {
                rmsg.SessionId = sessionId.Map(x => x.Value).IfNoneUnsafe((string)null);
            }
            return(Optional(rmsg));
        }
Exemple #4
0
 public Unit TellUserControl(UserControlMessage message)
 {
     if (message == null)
     {
         throw new ArgumentNullException(nameof(message));
     }
     if (userInbox != null)
     {
         try
         {
             userInbox.Post(message);
         }
         catch (QueueFullException)
         {
             throw new ProcessInboxFullException(actor.Id, MailboxSize, "user");
         }
     }
     return(unit);
 }
 public Unit TellUserControl(UserControlMessage message, Option <SessionId> sessionId)
 {
     if (message == null)
     {
         throw new ArgumentNullException(nameof(message));
     }
     if (userInbox != null)
     {
         try
         {
             message.SessionId = message.SessionId ?? sessionId.Map(s => s.Value).IfNoneUnsafe(message.SessionId);
             userInbox?.Post(message);
         }
         catch (QueueFullException)
         {
             throw new ProcessInboxFullException(actor.Id, MailboxSize, "user");
         }
     }
     return(unit);
 }
Exemple #6
0
        public Unit TellUserControl(UserControlMessage msg, Option <SessionId> sessionId)
        {
            if (msg == null)
            {
                throw new ArgumentNullException(nameof(msg));
            }

            if (userInbox != null)
            {
                msg.SessionId = msg.SessionId ?? sessionId.Map(s => s.Value).IfNoneUnsafe(msg.SessionId);
                if (IsPaused)
                {
                    // We're paused, so send to our persistent queue
                    new ActorDispatchRemote(
                        ActorContext.System(actor.Id).Ping,
                        actor.Id,
                        cluster,
                        msg.SessionId == null
                            ? None
                            : Some(new SessionId(msg.SessionId)),
                        false)
                    .TellUserControl(msg, ProcessId.None);
                }
                else
                {
                    try
                    {
                        userInbox?.Post(msg);
                    }
                    catch (QueueFullException)
                    {
                        throw new ProcessInboxFullException(actor.Id, MailboxSize, "user");
                    }
                }
            }
            return(unit);
        }
 public Unit TellUserControl(UserControlMessage message, ProcessId sender) =>
 Raise <Unit>(sender);
 public Unit TellUserControl(UserControlMessage message, ProcessId sender) =>
 IterRoleMembers(d => d.TellUserControl(message, sender));
 public Unit TellUserControl(ProcessId pid, UserControlMessage message) =>
 GetDispatcher(pid).TellUserControl(message, Self);
 public Unit TellUserControl(UserControlMessage message, ProcessId sender) =>
 transactionalIO
         ? ProcessOp.IO(() => Inbox.TellUserControl(message))
         : Inbox.TellUserControl(message);
 public Unit TellUserControl(UserControlMessage message, ProcessId sender) =>
 Tell(message, sender, "usr-" + message.Tag.ToString().ToLower(), Message.Type.UserControl);
 public Unit TellUserControl(UserControlMessage message, ProcessId sender) =>
 Tell(message, Schedule.Immediate, sender, "user", Message.Type.UserControl, message.Tag);
Exemple #13
0
 public Unit TellUserControl(UserControlMessage message) => unit;
Exemple #14
0
        public static InboxDirective UserMessageInbox <S, T>(Actor <S, T> actor, IActorInbox inbox, UserControlMessage msg, ActorItem parent)
        {
            var session = msg.SessionId == null
                ? None
                : Some(new SessionId(msg.SessionId));

            switch (msg.Tag)
            {
            case Message.TagSpec.UserAsk:
                var rmsg = ((ActorRequest)msg).SetSystem(actor.Id.System);
                return(ActorContext.System(actor.Id).WithContext(new ActorItem(actor, inbox, actor.Flags), parent, rmsg.ReplyTo, rmsg, msg, session, () => actor.ProcessAsk(rmsg)));

            case Message.TagSpec.UserReply:
                var urmsg = ((ActorResponse)msg).SetSystem(actor.Id.System);
                ActorContext.System(actor.Id).WithContext(new ActorItem(actor, inbox, actor.Flags), parent, urmsg.ReplyFrom, null, msg, session, () => actor.ProcessResponse(urmsg));
                break;

            case Message.TagSpec.UserTerminated:
                var utmsg = ((TerminatedMessage)msg).SetSystem(actor.Id.System);
                return(ActorContext.System(actor.Id).WithContext(new ActorItem(actor, inbox, actor.Flags), parent, utmsg.Id, null, msg, session, () => actor.ProcessTerminated(utmsg.Id)));

            case Message.TagSpec.User:
                var umsg = ((UserMessage)msg).SetSystem(actor.Id.System);
                return(ActorContext.System(actor.Id).WithContext(new ActorItem(actor, inbox, actor.Flags), parent, umsg.Sender, null, msg, session, () => actor.ProcessMessage(umsg.Content)));

            case Message.TagSpec.ShutdownProcess:
                kill(actor.Id);
                break;
            }
            return(InboxDirective.Default);
        }