Esempio n. 1
0
        protected override void OnActorDataReceived(object sender, ActorDataReceivedEventArgs e)
        {
            ActorFrameHeader actorLookupRequestFrameHeader = null;
            bool             isHeaderDecoded = this.ChannelConfiguration.FrameBuilder.TryDecodeFrameHeader(
                e.Data, e.DataOffset, e.DataLength,
                out actorLookupRequestFrameHeader);

            if (isHeaderDecoded && actorLookupRequestFrameHeader.OpCode == OpCode.Where)
            {
                byte[] payload;
                int    payloadOffset;
                int    payloadCount;
                this.ChannelConfiguration.FrameBuilder.DecodePayload(
                    e.Data, e.DataOffset, actorLookupRequestFrameHeader,
                    out payload, out payloadOffset, out payloadCount);
                var actorLookupRequestData = this.ChannelConfiguration
                                             .FrameBuilder
                                             .ControlFrameDataDecoder
                                             .DecodeFrameData <ActorIdentityLookup>(payload, payloadOffset, payloadCount);
                var lookupActorType = actorLookupRequestData != null ? actorLookupRequestData.Type : null;

                var actorCollection = new ActorIdentityCollection();
                actorCollection.Items.AddRange(this.GetAllActors().Where(a => a.Type == lookupActorType).ToList());
                var actorLookupResponseData  = this.ChannelConfiguration.FrameBuilder.ControlFrameDataEncoder.EncodeFrameData(actorCollection);
                var actorLookupResponse      = new HereFrame(actorLookupResponseData);
                var actorLookupRequestBuffer = this.ChannelConfiguration.FrameBuilder.EncodeFrame(actorLookupResponse);

                _log.InfoFormat("Lookup actors [{0}], RemoteActor[{1}].", actorCollection.Items.Count, e.RemoteActor);
                this.BeginSend(e.RemoteActor.Type, e.RemoteActor.Name, actorLookupRequestBuffer);
            }
            else
            {
                base.OnActorDataReceived(sender, e);
            }
        }
Esempio n. 2
0
        private void NotifyActorChanged(ActorIdentity changedActor)
        {
            var actorCollection = new ActorIdentityCollection();

            actorCollection.Items.AddRange(this.GetAllActors().Where(a => a.Type == changedActor.Type).ToList());
            var actorChangedNotificationData   = this.ChannelConfiguration.FrameBuilder.ControlFrameDataEncoder.EncodeFrameData(actorCollection);
            var actorChangedNotification       = new ChangeFrame(actorChangedNotificationData);
            var actorChangedNotificationBuffer = this.ChannelConfiguration.FrameBuilder.EncodeFrame(actorChangedNotification);

            _log.DebugFormat("Broadcast actors changes, ActorType[{0}], RemainCount[{1}].", changedActor.Type, actorCollection.Items.Count);
            this.BeginBroadcast(this.GetAllActors().Where(a => a.Type != changedActor.Type).Select(a => a.Type).Distinct(), actorChangedNotificationBuffer);
        }