示例#1
0
        public async Task PurgesPidCacheOnNullResponse()
        {
            var system = new ActorSystem();

            system.Metrics.Register(new ClusterMetrics(system.Metrics));
            var props    = Props.FromProducer(() => new EchoActor());
            var deadPid  = system.Root.SpawnNamed(props, "stopped");
            var alivePid = system.Root.SpawnNamed(props, "alive");
            await system.Root.StopAsync(deadPid).ConfigureAwait(false);

            var dummyIdentityLookup = new DummyIdentityLookup(alivePid);
            var pidCache            = new PidCache();

            var logger          = Log.CreateLogger("dummylog");
            var clusterIdentity = new ClusterIdentity {
                Identity = "identity", Kind = "kind"
            };

            pidCache.TryAdd(clusterIdentity, deadPid);
            var requestAsyncStrategy = new DefaultClusterContext(dummyIdentityLookup, pidCache, new ClusterContextConfig(), system.Shutdown);

            var res = await requestAsyncStrategy.RequestAsync <Pong>(clusterIdentity, new Ping { Message = "msg" }, system.Root,
                                                                     new CancellationTokenSource(6000).Token
                                                                     );

            res !.Message.Should().Be("msg");
            var foundInCache = pidCache.TryGet(clusterIdentity, out var pidInCache);

            foundInCache.Should().BeTrue();
            pidInCache.Should().BeEquivalentTo(alivePid);
        }
示例#2
0
        protected virtual int ResolvePid(Type type)
        {
            if (!PidCache.TryGetValue(type, out int pid))
            {
                pid = AddToPidCache(type);
            }

            return(pid);
        }
示例#3
0
        protected virtual byte ResolvePid <T>()
            where T : class, IOBDData, new()
        {
            if (!PidCache.TryGetValue(typeof(T), out byte pid))
            {
                pid = AddToPidCache <T>();
            }

            return(pid);
        }
示例#4
0
        protected virtual byte ResolvePid <T>()
            where T : class, IOBDData, new()
        {
            byte pid;

            if (!PidCache.TryGetValue(typeof(T), out pid))
            {
                T data = Activator.CreateInstance <T>();
                pid = data.PID;
                PidCache.Add(typeof(T), pid);
                DataTypeCache.Add(pid, typeof(T));
            }

            return(pid);
        }
示例#5
0
        protected virtual byte AddToPidCache(Type obdDataType)
        {
            IOBDData data = (IOBDData)Activator.CreateInstance(obdDataType);

            if (data == null)
            {
                throw new ArgumentException("Has to implement IOBDData", nameof(obdDataType));
            }

            byte pid = data.PID;

            PidCache.Add(obdDataType, pid);
            DataTypeCache.Add(pid, obdDataType);

            return(pid);
        }