コード例 #1
0
ファイル: PublisherActor.cs プロジェクト: vishalishere/vivego
        public Task ReceiveAsync(IContext context)
        {
            switch (context.Message)
            {
            case Publish publish:
                foreach ((PID, object)tuple in _subscriptions.Select(publish.Topic, publish.Message))
                {
                    tuple.Item1.Tell(publish);
                }

                return(Task.CompletedTask);

            case Subscribe subscribe:
                SubscriptionInfo subscriptionInfo = new SubscriptionInfo(Type.GetType(subscribe.Type), subscribe.Topic);
                _subscriptions.Add(subscriptionInfo, subscribe.ConsumerActor);
                SubscribeAck subscribeAck = new SubscribeAck
                {
                    SubscriptionId = ByteString.CopyFrom(subscriptionInfo.SubscriptionId.ToByteArray())
                };
                context.Respond(subscribeAck);
                return(Task.CompletedTask);

            case Unsubscribe unsubscribe:
                UnsubscribeAck unsubscribeAck = new UnsubscribeAck
                {
                    Success = _subscriptions.Remove(new Guid(unsubscribe.SubscriptionId.ToByteArray()))
                };
                context.Respond(unsubscribeAck);
                return(Task.CompletedTask);

            default:
                return(Task.CompletedTask);
            }
        }
コード例 #2
0
        public async Task when_writing_unsubscribe_ack_packet_then_succeeds(string jsonPath, string packetPath)
        {
            jsonPath   = Path.Combine(Environment.CurrentDirectory, jsonPath);
            packetPath = Path.Combine(Environment.CurrentDirectory, packetPath);

            byte[] expectedPacket = Packet.ReadAllBytes(packetPath);
            FlowPacketFormatter <UnsubscribeAck> formatter = new FlowPacketFormatter <UnsubscribeAck>(MqttPacketType.UnsubscribeAck, id => new UnsubscribeAck(id));
            UnsubscribeAck unsubscribeAck = Packet.ReadPacket <UnsubscribeAck>(jsonPath);

            byte[] result = await formatter.FormatAsync(unsubscribeAck);

            expectedPacket.Should().BeEquivalentTo(result);
        }
コード例 #3
0
        public async Task when_unsubscribing_existing_subscriptions_then_subscriptions_are_deleted_and_ack_is_sent()
        {
            Mock <IRepository <ClientSession> > sessionRepository = new Mock <IRepository <ClientSession> >();
            string clientId              = Guid.NewGuid().ToString();
            ushort packetId              = (ushort)new Random().Next(0, ushort.MaxValue);
            string topic                 = "foo/bar/test";
            MqttQualityOfService qos     = MqttQualityOfService.AtLeastOnce;
            ClientSession        session = new ClientSession(clientId, clean: false)
            {
                Subscriptions = new List <ClientSubscription> {
                    new ClientSubscription {
                        ClientId = clientId, MaximumQualityOfService = qos, TopicFilter = topic
                    }
                }
            };
            ClientSession updatedSession = default;

            sessionRepository.Setup(r => r.Read(It.IsAny <string>())).Returns(session);
            sessionRepository.Setup(r => r.Update(It.IsAny <ClientSession>())).Callback <ClientSession>(s => updatedSession = s);

            Unsubscribe unsubscribe = new Unsubscribe(packetId, topic);

            Mock <IMqttChannel <IPacket> > channel = new Mock <IMqttChannel <IPacket> >();

            IPacket response = default;

            channel.Setup(c => c.SendAsync(It.IsAny <IPacket>()))
            .Callback <IPacket>(p => response = p)
            .Returns(Task.Delay(0));

            Mock <IConnectionProvider> connectionProvider = new Mock <IConnectionProvider>();

            connectionProvider
            .Setup(p => p.GetConnection(It.Is <string>(c => c == clientId)))
            .Returns(channel.Object);

            ServerUnsubscribeFlow flow = new ServerUnsubscribeFlow(sessionRepository.Object);

            await flow.ExecuteAsync(clientId, unsubscribe, channel.Object);

            Assert.NotNull(response);
            0.Should().Be(updatedSession.Subscriptions.Count);

            UnsubscribeAck unsubscribeAck = response as UnsubscribeAck;

            Assert.NotNull(unsubscribeAck);
            packetId.Should().Be(unsubscribeAck.PacketId);
        }
コード例 #4
0
        public async Task when_unsubscribing_not_existing_subscriptions_then_ack_is_sent()
        {
            Mock <IRepository <ClientSession> > sessionRepository = new Mock <IRepository <ClientSession> >();
            string        clientId = Guid.NewGuid().ToString();
            ushort        packetId = (ushort)new Random().Next(0, ushort.MaxValue);
            ClientSession session  = new ClientSession(clientId, clean: false);

            sessionRepository.Setup(r => r.Read(It.IsAny <string>())).Returns(session);

            Unsubscribe unsubscribe = new Unsubscribe(packetId, "foo/bar");

            Mock <IMqttChannel <IPacket> > channel = new Mock <IMqttChannel <IPacket> >();

            IPacket response = default;

            channel.Setup(c => c.SendAsync(It.IsAny <IPacket>()))
            .Callback <IPacket>(p => response = p)
            .Returns(Task.Delay(0));

            Mock <IConnectionProvider> connectionProvider = new Mock <IConnectionProvider>();

            connectionProvider
            .Setup(p => p.GetConnection(It.Is <string>(c => c == clientId)))
            .Returns(channel.Object);

            ServerUnsubscribeFlow flow = new ServerUnsubscribeFlow(sessionRepository.Object);

            await flow.ExecuteAsync(clientId, unsubscribe, channel.Object);

            sessionRepository.Verify(r => r.Delete(It.IsAny <string>()), Times.Never);
            Assert.NotNull(response);

            UnsubscribeAck unsubscribeAck = response as UnsubscribeAck;

            Assert.NotNull(unsubscribeAck);
            packetId.Should().Be(unsubscribeAck.PacketId);
        }
コード例 #5
0
ファイル: TopicMessages.cs プロジェクト: zhanjian/akka.net
 public Unsubscribed(UnsubscribeAck ack, IActorRef subscriber)
 {
     Ack        = ack;
     Subscriber = subscriber;
 }
コード例 #6
0
 public Unsubscribed(UnsubscribeAck ack, IActorRef subscriber)
 {
     Ack = ack;
     Subscriber = subscriber;
 }