/// <summary> /// Allocates a message in a block and returns the block the message is in. /// </summary> /// <param name="queueMessage"></param> /// <param name="dequeueTimeUtc"></param> /// <param name="streamPosition"></param> /// <returns></returns> public CachedMessageBlock <TCachedMessage> AllocateMessage(TQueueMessage queueMessage, DateTime dequeueTimeUtc, out StreamPosition streamPosition) { streamPosition = default(StreamPosition); if (queueMessage == null) { throw new ArgumentNullException("queueMessage"); } // allocate new cached message block if needed if (currentMessageBlock == null || !currentMessageBlock.HasCapacity) { currentMessageBlock = messagePool.Allocate(); } streamPosition = currentMessageBlock.Add(queueMessage, dequeueTimeUtc, dataAdapter); return(currentMessageBlock); }
/// <summary> /// Allocates a message in a block and returns the block the message is in. /// </summary> /// <param name="queueMessage"></param> /// <param name="dequeueTimeUtc"></param> /// <param name="streamPosition"></param> /// <returns></returns> public CachedMessageBlock <TCachedMessage> AllocateMessage(TQueueMessage queueMessage, DateTime dequeueTimeUtc, out StreamPosition streamPosition) { streamPosition = default(StreamPosition); if (queueMessage == null) { throw new ArgumentNullException(nameof(queueMessage)); } CachedMessageBlock <TCachedMessage> returnBlock = currentMessageBlock ?? (currentMessageBlock = messagePool.Allocate()); streamPosition = returnBlock.Add(queueMessage, dequeueTimeUtc, dataAdapter); // blocks at capacity are eligable for purge, so we don't want to be holding on to them. if (!currentMessageBlock.HasCapacity) { currentMessageBlock = messagePool.Allocate(); } return(returnBlock); }