public void Put(T e)
        {
            var data    = ToData(e);
            var request = QueuePutCodec.EncodeRequest(GetName(), data);

            Invoke(request);
        }
        Task EnqueueAsync(T item, CancellationToken cancellationToken)
        {
            var itemData       = ToSafeData(item);
            var requestMessage = QueuePutCodec.EncodeRequest(Name, itemData);
            var task           = Cluster.Messaging.SendToPartitionOwnerAsync(requestMessage, PartitionId, cancellationToken);

#if HZ_OPTIMIZE_ASYNC
            return(task);
#else
            await task.CfAwait();
#endif
        }
Exemplo n.º 3
0
        private async Task <bool> EnqueueAsync(T item, TimeSpan timeToWait, bool doThrow, CancellationToken cancellationToken)
        {
            var itemData = ToSafeData(item);

            var timeToWaitMilliseconds = timeToWait.TimeoutMilliseconds(0);
            var requestMessage         = timeToWaitMilliseconds < 0
                ? QueuePutCodec.EncodeRequest(Name, itemData)
                : QueueOfferCodec.EncodeRequest(Name, itemData, timeToWaitMilliseconds);

            ClientMessage responseMessage;

            try
            {
                responseMessage = await Cluster.Messaging.SendToKeyPartitionOwnerAsync(requestMessage, PartitionKeyData, cancellationToken).CAF();
            }
            catch
            {
                if (doThrow)
                {
                    throw;
                }
                return(false);
            }

            bool queued;

            if (timeToWaitMilliseconds < 0)
            {
                _      = QueuePutCodec.DecodeResponse(responseMessage);
                queued = true;
            }
            else
            {
                queued = QueueOfferCodec.DecodeResponse(responseMessage).Response;
            }

            if (queued)
            {
                return(true);
            }
            if (doThrow)
            {
                throw new InvalidOperationException("Queue is full.");
            }
            return(false);
        }