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); }
string CustomTranslationRule(EndpointInstanceName endpointInstanceName) { throw new NotImplementedException(); }
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)); }
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); }