private void Send(long deliveryId, AtLeastOnceDeliverySemantic.Delivery delivery, DateTime timestamp) { var destination = _context.ActorSelection(delivery.Destination); destination.Tell(delivery.Message); _unconfirmed = _unconfirmed.SetItem(deliveryId, new AtLeastOnceDeliverySemantic.Delivery(delivery.Destination, delivery.Message, timestamp, delivery.Attempt + 1)); }
/// <summary> /// TBD /// </summary> /// <param name="destination">TBD</param> /// <param name="deliveryMessageMapper">TBD</param> /// <param name="isRecovering">TBD</param> /// <exception cref="MaxUnconfirmedMessagesExceededException"> /// This exception is thrown when the actor exceeds the <see cref="MaxUnconfirmedMessages" /> count. /// </exception> public void Deliver(ActorPath destination, Func <long, object> deliveryMessageMapper, bool isRecovering) { if (_unconfirmed.Count >= MaxUnconfirmedMessages) { throw new MaxUnconfirmedMessagesExceededException( $"{_context.Self} has too many unconfirmed messages. Maximum allowed is {MaxUnconfirmedMessages}"); } var deliveryId = NextDeliverySequenceNr(); var now = isRecovering ? DateTime.UtcNow - RedeliverInterval : DateTime.UtcNow; var delivery = new AtLeastOnceDeliverySemantic.Delivery(destination, deliveryMessageMapper(deliveryId), now, 0); if (isRecovering) { _unconfirmed = _unconfirmed.SetItem(deliveryId, delivery); } else { Send(deliveryId, delivery, now); } }