in edge-hub/core/src/Microsoft.Azure.Devices.Edge.Hub.Amqp/ClientConnectionHandler.cs [66:118]
public async Task RegisterLinkHandler(ILinkHandler linkHandler)
{
using (await this.registryUpdateLock.LockAsync())
{
if (this.registry.TryGetValue(linkHandler.Type, out ILinkHandler currentLinkHandler))
{
await currentLinkHandler.CloseAsync(Constants.DefaultTimeout);
}
ILinkHandler nonCorrelatedLinkHandler = null;
switch (linkHandler.Type)
{
case LinkType.MethodReceiving:
if (this.registry.TryGetValue(LinkType.MethodSending, out ILinkHandler methodSendingLinkHandler)
&& methodSendingLinkHandler.CorrelationId != linkHandler.CorrelationId)
{
nonCorrelatedLinkHandler = methodSendingLinkHandler;
}
break;
case LinkType.MethodSending:
if (this.registry.TryGetValue(LinkType.MethodReceiving, out ILinkHandler methodReceivingLinkHandler)
&& methodReceivingLinkHandler.CorrelationId != linkHandler.CorrelationId)
{
nonCorrelatedLinkHandler = methodReceivingLinkHandler;
}
break;
case LinkType.TwinReceiving:
if (this.registry.TryGetValue(LinkType.TwinSending, out ILinkHandler twinSendingLinkHandler)
&& twinSendingLinkHandler.CorrelationId != linkHandler.CorrelationId)
{
nonCorrelatedLinkHandler = twinSendingLinkHandler;
}
break;
case LinkType.TwinSending:
if (this.registry.TryGetValue(LinkType.TwinReceiving, out ILinkHandler twinReceivingLinkHandler)
&& twinReceivingLinkHandler.CorrelationId != linkHandler.CorrelationId)
{
nonCorrelatedLinkHandler = twinReceivingLinkHandler;
}
break;
}
await (nonCorrelatedLinkHandler?.CloseAsync(Constants.DefaultTimeout) ?? Task.CompletedTask);
this.registry[linkHandler.Type] = linkHandler;
}
}