Krzysztof Porebski created AMQNET-610:
-----------------------------------------
Summary: Race condition during consumer creation and shutdown
Key: AMQNET-610
URL: https://issues.apache.org/jira/browse/AMQNET-610
Project: ActiveMQ .Net
Issue Type: Bug
Components: AMQP, NMS
Reporter: Krzysztof Porebski
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)