Unit DoScheduleNoIO(object message, ProcessId sender, Schedule schedule, Message.Type type, Message.TagSpec tag) { var inboxKey = ActorInboxCommon.ClusterScheduleKey(ProcessId); var id = schedule.Key ?? Guid.NewGuid().ToString(); var current = Cluster.GetHashField <RemoteMessageDTO>(inboxKey, id); message = current.Match( Some: last => { var a = MessageSerialiser.DeserialiseMsg(last, ProcessId) as UserMessage; var m = a == null ? message : schedule.Fold(a.Content, message); return(m); }, None: () => schedule.Fold(schedule.Zero, message)); ValidateMessageType(message, sender); var dto = RemoteMessageDTO.Create(message, ProcessId, sender, type, tag, SessionId, schedule.Due.Ticks); tell(ProcessId.Take(1).Child("system").Child("scheduler"), Scheduler.Msg.AddToSchedule(inboxKey, id, dto)); //Cluster.HashFieldAddOrUpdate(inboxKey, id, dto); return(unit); }
public Unit TellSystem(SystemMessage message, ProcessId sender) => transactionalIO ? ignore(Cluster.PublishToChannel( ActorInboxCommon.ClusterSystemInboxNotifyKey(ProcessId), RemoteMessageDTO.Create(message, ProcessId, sender, Message.Type.System, message.Tag, SessionId, 0))) : ProcessOp.IO(() => { var clientsReached = Cluster.PublishToChannel( ActorInboxCommon.ClusterSystemInboxNotifyKey(ProcessId), RemoteMessageDTO.Create(message, ProcessId, sender, Message.Type.System, message.Tag, SessionId, 0)); return(unit); });
Unit TellNoIO(object message, ProcessId sender, string inbox, Message.Type type, Message.TagSpec tag) { ValidateMessageType(message, sender); var dto = RemoteMessageDTO.Create(message, ProcessId, sender, type, tag, SessionId, 0); var inboxKey = ActorInboxCommon.ClusterInboxKey(ProcessId, inbox); var inboxNotifyKey = ActorInboxCommon.ClusterInboxNotifyKey(ProcessId, inbox); Cluster.Enqueue(inboxKey, dto); var clientsReached = Cluster.PublishToChannel(inboxNotifyKey, dto.MessageId); return(unit); }