Ejemplo n.º 1
0
        protected override async Task OnStart(IBusContext context)
        {
            var routingTable      = settings.Get <UnicastRoutingTable>();
            var endpointInstances = settings.Get <EndpointInstances>();

            routingTable.AddDynamic((list, bag) => FindDestination(list));
            endpointInstances.AddDynamic(FindInstances);

            subscription = await dataBackplane.GetAllAndSubscribeToChanges("NServiceBus.HandledMessages",
                                                                           async e =>
            {
                var deserializedData = JsonConvert.DeserializeObject <HandledMessageDeclaration>(e.Data);
                var endpointName     = new EndpointName(deserializedData.EndpointName);
                var instanceName     = new EndpointInstanceName(endpointName, deserializedData.UserDiscriminator, deserializedData.TransportDiscriminator);

                var types =
                    deserializedData.HandledMessageTypes.Select(x => Type.GetType(x, false))
                    .Where(x => x != null)
                    .ToArray();

                EndpointInstanceInfo instanceInfo;
                if (!instanceInformation.TryGetValue(instanceName, out instanceInfo))
                {
                    var newInstanceInformation = new Dictionary <EndpointInstanceName, EndpointInstanceInfo>(instanceInformation);
                    instanceInfo = new EndpointInstanceInfo();
                    newInstanceInformation[instanceName] = instanceInfo;
                    instanceInformation = newInstanceInformation;
                }
                if (deserializedData.Active)
                {
                    instanceInfo.Activate(deserializedData.Timestamp);
                    Logger.InfoFormat("Instance {0} active (heartbeat).", instanceName);
                }
                else
                {
                    instanceInfo.Deactivate();
                    Logger.InfoFormat("Instance {0} deactivated.", instanceName);
                }
                await UpdateCaches(endpointName, instanceName, types);
            },
                                                                           async e =>
            {
                var deserializedData = JsonConvert.DeserializeObject <HandledMessageDeclaration>(e.Data);
                var endpointName     = new EndpointName(deserializedData.EndpointName);
                var instanceName     = new EndpointInstanceName(endpointName, deserializedData.UserDiscriminator,
                                                                deserializedData.TransportDiscriminator);

                Logger.InfoFormat("Instance {0} removed from routing tables.", instanceName);

                await UpdateCaches(endpointName, instanceName, new Type[0]);

                instanceInformation.Remove(instanceName);
            });

            sweepTimer = new Timer(state =>
            {
                foreach (var info in instanceInformation)
                {
                    if (!info.Value.Sweep(DateTime.UtcNow, heartbeatTimeout))
                    {
                        Logger.InfoFormat("Instance {0} deactivated (heartbeat timeout).", info.Key);
                    }
                }
            }, null, sweepPeriod, sweepPeriod);
        }
Ejemplo n.º 2
0
 string CustomTranslationRule(EndpointInstanceName endpointInstanceName)
 {
     throw new NotImplementedException();
 }
Ejemplo n.º 3
0
        private Dictionary <EndpointName, HashSet <EndpointInstanceName> > BuildNewInstanceMap(EndpointName endpointName, EndpointInstanceName instanceName)
        {
            var newInstanceMap = new Dictionary <EndpointName, HashSet <EndpointInstanceName> >();

            foreach (var pair in instanceMap)
            {
                var otherInstances = pair.Value.Where(x => x != instanceName);
                newInstanceMap[pair.Key] = new HashSet <EndpointInstanceName>(otherInstances);
            }
            HashSet <EndpointInstanceName> endpointEntry;

            if (!newInstanceMap.TryGetValue(endpointName, out endpointEntry))
            {
                endpointEntry = new HashSet <EndpointInstanceName>();
                newInstanceMap[endpointName] = endpointEntry;
            }
            endpointEntry.Add(instanceName);
            return(newInstanceMap);
        }
Ejemplo n.º 4
0
 private Task UpdateCaches(EndpointName endpointName, EndpointInstanceName instanceName, Type[] types)
 {
     instanceMap = BuildNewInstanceMap(endpointName, instanceName);
     endpointMap = BuildNewEndpointMap(endpointName, types);
     return(Task.FromResult(0));
 }
        protected override async Task OnStart(IBusContext context)
        {
            var routingTable = settings.Get<UnicastRoutingTable>();
            var endpointInstances = settings.Get<EndpointInstances>();

            routingTable.AddDynamic((list, bag) => FindDestination(list));
            endpointInstances.AddDynamic(FindInstances);
           
            subscription = await dataBackplane.GetAllAndSubscribeToChanges("NServiceBus.HandledMessages",
                async e =>
                {
                    var deserializedData = JsonConvert.DeserializeObject<HandledMessageDeclaration>(e.Data);
                    var endpointName = new EndpointName(deserializedData.EndpointName);
                    var instanceName = new EndpointInstanceName(endpointName, deserializedData.UserDiscriminator, deserializedData.TransportDiscriminator);

                    var types =
                        deserializedData.HandledMessageTypes.Select(x => Type.GetType(x, false))
                            .Where(x => x != null)
                            .ToArray();

                    EndpointInstanceInfo instanceInfo;
                    if (!instanceInformation.TryGetValue(instanceName, out instanceInfo))
                    {
                        var newInstanceInformation = new Dictionary<EndpointInstanceName, EndpointInstanceInfo>(instanceInformation);
                        instanceInfo = new EndpointInstanceInfo();
                        newInstanceInformation[instanceName] = instanceInfo;
                        instanceInformation = newInstanceInformation;
                    }
                    if (deserializedData.Active)
                    {
                        instanceInfo.Activate(deserializedData.Timestamp);
                        Logger.InfoFormat("Instance {0} active (heartbeat).", instanceName);
                    }
                    else
                    {
                        instanceInfo.Deactivate();
                        Logger.InfoFormat("Instance {0} deactivated.", instanceName);
                    }
                    await UpdateCaches(endpointName, instanceName, types);
                }, 
                async e =>
                {

                    var deserializedData = JsonConvert.DeserializeObject<HandledMessageDeclaration>(e.Data);
                    var endpointName = new EndpointName(deserializedData.EndpointName);
                    var instanceName = new EndpointInstanceName(endpointName, deserializedData.UserDiscriminator,
                        deserializedData.TransportDiscriminator);

                    Logger.InfoFormat("Instance {0} removed from routing tables.", instanceName);

                    await UpdateCaches(endpointName, instanceName, new Type[0]);

                    instanceInformation.Remove(instanceName);
                });
            sweepTimer = new Timer(state =>
            {
                foreach (var info in instanceInformation)
                {
                    if (!info.Value.Sweep(DateTime.UtcNow, heartbeatTimeout))
                    {
                        Logger.InfoFormat("Instance {0} deactivated (heartbeat timeout).", info.Key);
                    }
                }
            }, null, sweepPeriod, sweepPeriod);
        }
 private Dictionary<EndpointName, HashSet<EndpointInstanceName>> BuildNewInstanceMap(EndpointName endpointName, EndpointInstanceName instanceName)
 {
     var newInstanceMap = new Dictionary<EndpointName, HashSet<EndpointInstanceName>>();
     foreach (var pair in instanceMap)
     {
         var otherInstances = pair.Value.Where(x => x != instanceName);
         newInstanceMap[pair.Key] = new HashSet<EndpointInstanceName>(otherInstances);
     }
     HashSet<EndpointInstanceName> endpointEntry;
     if (!newInstanceMap.TryGetValue(endpointName, out endpointEntry))
     {
         endpointEntry = new HashSet<EndpointInstanceName>();
         newInstanceMap[endpointName] = endpointEntry;
     }
     endpointEntry.Add(instanceName);
     return newInstanceMap;
 }
 private Task UpdateCaches(EndpointName endpointName, EndpointInstanceName instanceName, Type[] types)
 {
     instanceMap = BuildNewInstanceMap(endpointName, instanceName);
     endpointMap = BuildNewEndpointMap(endpointName, types);
     return Task.FromResult(0);
 }