예제 #1
0
        /// <summary>
        /// Fills binary data to the queue
        /// </summary>
        public PushResult FillData(IEnumerable <byte[]> items, bool createAsSaved, bool highPriority)
        {
            if (_queue.Status == QueueStatus.Stopped)
            {
                return(PushResult.StatusNotSupported);
            }

            int max = _queue.HighPriorityLinkedList.Count + _queue.RegularLinkedList.Count + items.Count();

            if (_queue.Options.MessageLimit > 0 && max > _queue.Options.MessageLimit)
            {
                return(PushResult.LimitExceeded);
            }

            foreach (byte[] item in items)
            {
                TmqMessage message = new TmqMessage(MessageType.Channel, _queue.Channel.Name);
                message.FirstAcquirer       = true;
                message.HighPriority        = highPriority;
                message.AcknowledgeRequired = _queue.Options.RequestAcknowledge;
                message.ContentType         = _queue.Id;

                if (_queue.Options.UseMessageId)
                {
                    message.SetMessageId(_queue.Channel.Server.MessageIdGenerator.Create());
                }

                message.Content          = new MemoryStream(item);
                message.Content.Position = 0;
                message.CalculateLengths();

                QueueMessage qm = new QueueMessage(message, createAsSaved);

                if (highPriority)
                {
                    lock (_queue.HighPriorityLinkedList)
                        _queue.HighPriorityLinkedList.AddLast(qm);
                }
                else
                {
                    lock (_queue.RegularLinkedList)
                        _queue.RegularLinkedList.AddLast(qm);
                }
            }

            _queue.Info.UpdateHighPriorityMessageCount(_queue.HighPriorityLinkedList.Count);
            _queue.Info.UpdateRegularMessageCount(_queue.RegularLinkedList.Count);
            return(PushResult.Success);
        }
예제 #2
0
        public void DisconnectDueToPingTimeout()
        {
            TestMqServer server = new TestMqServer();

            server.Initialize(42105);
            server.Start();

            TcpClient client = new TcpClient();

            client.Connect("127.0.0.1", 42105);

            NetworkStream stream = client.GetStream();

            stream.Write(PredefinedMessages.PROTOCOL_BYTES);
            TmqMessage msg = new TmqMessage();

            msg.Type        = MessageType.Server;
            msg.ContentType = KnownContentTypes.Hello;
            msg.SetStringContent("GET /\r\nName: Test-42105");
            msg.CalculateLengths();
            TmqWriter writer = new TmqWriter();

            writer.Write(msg, stream).Wait();
            Thread.Sleep(1000);
            Assert.Equal(1, server.ClientConnected);

            ThreadPool.UnsafeQueueUserWorkItem(async s =>
            {
                byte[] buffer = new byte[128];
                while (client.Connected)
                {
                    int r = await s.ReadAsync(buffer);
                    if (r == 0)
                    {
                        client.Dispose();
                        break;
                    }
                }
            }, stream, false);

            Thread.Sleep(25000);

            Assert.False(client.Connected);
            Assert.Equal(1, server.ClientDisconnected);
        }
예제 #3
0
 /// <summary>
 /// Finishes the message preparation and returns
 /// </summary>
 public TmqMessage Get()
 {
     _message.Content = new MemoryStream(Encoding.UTF8.GetBytes(_content.ToString()));
     _message.CalculateLengths();
     return(_message);
 }