[ https://issues.apache.org/jira/browse/AMQNET-610?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Krzysztof Porebski resolved AMQNET-610. --------------------------------------- Fix Version/s: 1.8.0 Resolution: Fixed > Race condition during consumer creation > --------------------------------------- > > Key: AMQNET-610 > URL: https://issues.apache.org/jira/browse/AMQNET-610 > Project: ActiveMQ .Net > Issue Type: Bug > Components: AMQP, NMS > Reporter: Krzysztof Porebski > Priority: Critical > Fix For: 1.8.0 > > Time Spent: 2h 20m > Remaining Estimate: 0h > > Working on CI I found a race condition that reveals itself on slower machines > and may result in losing messages by consumers. > The race condition is a result of treating the creation of consumer resources > and starting them as an atomic operation: > {code:java} > public async Task Init() > { > await Session.Connection.CreateResource(Info); > await Session.Connection.StartResource(Info); > } > {code} > On slower boxes pending message may be delivered to the provider before above > code returns: > {code:java} > public IMessageConsumer CreateConsumer(IDestination destination, string > selector, bool noLocal) > { > CheckClosed(); NmsMessageConsumer messageConsumer = new > NmsMessageConsumer(consumerIdGenerator.GenerateId(), this, destination, > selector, noLocal); > messageConsumer.Init().ConfigureAwait(false).GetAwaiter().GetResult(); > // here may be a race condition > consumers.TryAdd(messageConsumer.Info.Id, messageConsumer); > > return messageConsumer; > } > {code} > If message arrives before `Init` returns (which means before newly created > consumer is added to the list of available consumers), the message will be > ignored. > {code:java} > public void OnInboundMessage(InboundMessageDispatch envelope) > { > if (consumers.TryGetValue(envelope.ConsumerInfo.Id, out > NmsMessageConsumer messageConsumer)) > { > messageConsumer.OnInboundMessage(envelope); > } > } > {code} > > > -- This message was sent by Atlassian Jira (v8.3.2#803003)