Beispiel #1
0
        private void HandleMessage(object sender, BasicDeliverEventArgs ea)
        {
            var data    = Encoding.UTF8.GetString(ea.Body.ToArray());
            var message = new MqMessage(data, ea.BasicProperties.CorrelationId, ea.BasicProperties.Type, ea.BasicProperties.ReplyTo);

            this.Received.Invoke(this, message);
        }
        public void CreateOrder(OrderInput input)
        {
            if (input.Details == null || !input.Details.Any())
            {
                throw new KnownException("订单错误找不到详情");
            }
            var header  = _mapper.Map <OrderHeader>(input);
            var details = _mapper.Map <List <Data.OrderDetail> >(input.Details);

            details.ForEach(x => x.ParentId = header.Id);
            header.Amount = details.Sum(x => x.Price * x.Quantity);
            var msg = _mapper.Map <OrderCreatedEvent>(header);

            msg.Details = _mapper.Map <List <Message.OrderDetail> >(details);
            var dbMessage = new MqMessage()
            {
                Body = JsonConvert.SerializeObject(msg, new JsonSerializerSettings()
                {
                    ContractResolver = new CamelCasePropertyNamesContractResolver(),
                    DateFormatString = "yyyy-MM-dd hh:mm:ss"
                }),
                MessageAssemblyName  = typeof(OrderCreatedEvent).Assembly.GetName().Name,
                MessageClassFullName = msg.GetType().FullName
            };

            _dbContext.Add(dbMessage);
            _dbContext.Add(header);
            _dbContext.AddRange(details);
            _dbContext.SaveChanges();
        }
        public async Task GetMessageAsync_BatchWithDelete()
        {
            PassiveMqQueuClient client = this.Account.CreateQueueClient($"myTestQueue-{Guid.NewGuid()}");
            await client.DeleteIfExists();

            try
            {
                await client.CrateIfNotExists();

                for (int i = 1; i < 10; i++)
                {
                    await client.AddMessage(new MqCreateMessage(i.ToString()));
                }

                await Task.Delay(50);

                List <int> results = new List <int>();
                for (int i = 1; i < 10; i++)
                {
                    MqMessage message = await client.GetMessage();

                    results.Add(int.Parse(message.AsString));
                    await Task.Delay(3);

                    await client.DeleteMessage(message.Id);
                }

                CollectionAssert.AllItemsAreUnique(results, "GetMessageAsync rerurns multiple same result.");
            }
            finally
            {
                await client.DeleteIfExists();
            }
        }
        public async Task GetMessageAsync_CheckValues(string message, string label)
        {
            PassiveMqQueuClient client = this.Account.CreateQueueClient("myTestQueue");
            await client.DeleteIfExists();

            try
            {
                await client.CrateIfNotExists();

                await client.AddMessage(new MqCreateMessage(message, label));

                MqMessage realMessage = await client.GetMessage();

                Assert.AreEqual(message, realMessage.AsString);
                Assert.AreEqual(label, realMessage.Label);

                Assert.AreNotEqual(Guid.Empty, realMessage.Id);
                Assert.AreNotEqual(default(DateTime), realMessage.InsertionTime);
                Assert.AreNotEqual(null, realMessage.NextVisibleTime);
            }
            finally
            {
                await client.DeleteIfExists();
            }
        }
Beispiel #5
0
        /// <summary>
        /// 消息发布
        /// </summary>
        /// <param name="exchange">交换器</param>
        /// <param name="type">交换器类型</param>
        /// <param name="queue">消息队列</param>
        /// <param name="message">消息</param>
        /// <param name="routingKey">路由键</param>
        internal void Publish(string type, string queue, MqMessage message, string routingKey)
        {
            try
            {
                string exchange = Config.MqConfig.AppID + "_" + type.ToString().ToLower();

                string sendMessage = JsonConvert.SerializeObject(message);
                //信道
                using (var channel = MqConnection.GetMqConnection().CreateModel())
                {
                    //Exchange
                    channel.ExchangeDeclare(exchange, type, true, false, null);
                    //声明队列
                    channel.QueueDeclare(queue, true, false, false, null);
                    //队列绑定
                    channel.QueueBind(queue, exchange, routingKey, null);
                    IBasicProperties props = channel.CreateBasicProperties();
                    props.ContentType  = "json";
                    props.DeliveryMode = 2;
                    //过期时间
                    //props.Expiration = "36000000";
                    //发布消息
                    channel.BasicPublish(exchange, routingKey, props, Encoding.UTF8.GetBytes(sendMessage));
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public async Task Publisher_PublishAsync_CheckMatch(string topicClient, string publishTopic, bool match)
        {
            string message = "my test message";
            string label   = "myLabel";

            PassiveMqQueuClient    clientConsumer = this.Account.CreateQueueClient("myTestQueue");
            PassiveMqPublishClient publisher      = this.Account.CreatePublishClient();

            try
            {
                await clientConsumer.DeleteIfExists();

                await clientConsumer.CrateIfNotExists(topicClient);

                await publisher.Publish(publishTopic, new MqCreateMessage(message, label));

                MqMessage resultMessage = await clientConsumer.GetMessage();

                Assert.AreEqual(match, resultMessage != null, $"Inconsistent topic client '{topicClient}', topic publish '{publishTopic}', excepted match {match}.");

                if (match == true)
                {
                    Assert.AreEqual(message, resultMessage.AsString);
                    Assert.AreEqual(label, resultMessage.Label);
                }
            }
            finally
            {
                await clientConsumer.DeleteIfExists();
            }
        }
        public async Task GetMessageAsync_VisibilityTime()
        {
            PassiveMqQueuClient client = this.Account.CreateQueueClient("myTestQueue");
            await client.DeleteIfExists();

            try
            {
                await client.CrateIfNotExists();

                await client.AddMessage(new MqCreateMessage("some messagefor MOM"));

                MqMessage realMessage = await client.GetMessage(TimeSpan.FromSeconds(5));

                Assert.IsNotNull(realMessage);
                Assert.AreEqual(1, realMessage.RetryCount);

                MqMessage realNextMessage = await client.GetMessage();

                Assert.IsNull(realNextMessage);

                await Task.Delay(10000);

                MqMessage realRentrantMessage = await client.GetMessage();

                Assert.IsNotNull(realRentrantMessage);
                Assert.AreEqual(2, realRentrantMessage.RetryCount);
            }
            finally
            {
                await client.DeleteIfExists();
            }
        }
Beispiel #8
0
        /// <summary>
        /// Gets an available cached instance of the serializer.  If one is not cached, generate a new one.
        /// </summary>
        /// <param name="message">Message to initialize the MqReader with.  Null to just reset.</param>
        /// <returns>Cached serializer.</returns>
        public Serializer Get(MqMessage message = null)
        {
            Serializer serializer;

            // Try to get an existing cached serializer.
            if (_cachedContainers.TryDequeue(out serializer) == false)
            {
                // A cached serializer does not exist.  Create a new one.
                var mqWriter = new MqMessageWriter(_config);
                var mqReader = new MqMessageReader();

                serializer = new Serializer
                {
                    MessageWriter = mqWriter,
                    MessageReader = mqReader,
                    Stream        = new MemoryStream()
                };
            }
            else
            {
                serializer.Stream.SetLength(0);
                serializer.MessageWriter.Clear();
            }

            serializer.MessageReader.Message = message;

            return(serializer);
        }
Beispiel #9
0
        public EventHandlerResult Handle(MqMessage <string> msg)
        {
            Console.WriteLine("FACE !!!");

            var model = JsonConvert.DeserializeObject <FaceDetectedEvent>(msg.Payload);

            var cmd = new IdentifyFaceCmd()
            {
                ImageId  = model.ImageId,
                ImageUrl = model.ImageUrl,
                X        = model.X,
                Y        = model.Y,
                Width    = model.Width,
                Height   = model.Height
            };

            IBasicProperties props = _client.Model.CreateBasicProperties();

            _client.Model.BasicPublish("msg_gateway", "vision.cmd.identify-face", true, props, RabbitMqMessageHelper.GetModelAsMessagePayload(cmd));

            _client.AckMessage(msg.DeliveryTag);

            return(new EventHandlerResult()
            {
                Success = true, MessageAcked = true
            });
        }
        public async Task AddMessageAsync_Success(string messageText, string label)
        {
            PassiveMqQueuClient client = this.Account.CreateQueueClient("myTestQueue");

            await client.DeleteIfExists();

            try
            {
                await client.CrateIfNotExists();

                MqCreateMessage sendMessage    = new MqCreateMessage(messageText, label);
                MqMessage       createdMessage = await client.AddMessage(sendMessage);

                Assert.IsNotNull(createdMessage);
                Assert.AreEqual(messageText, createdMessage.AsString);
                Assert.AreEqual(label, createdMessage.Label);

                Assert.AreNotEqual(Guid.Empty, createdMessage.Id);
                Assert.AreNotEqual(default(DateTime), createdMessage.InsertionTime);
            }
            finally
            {
                await client.DeleteIfExists();
            }
        }
Beispiel #11
0
        public async Task Consume(MqMessage <QueueRequestMessage> message)
        {
            var processingReqDetails = await _api.Request(s => s.MakeRequestProcessing(message.Payload.Id)).GetDetailedAsync();

            _reporter?.Report(processingReqDetails);

            var request = JsonConvert.DeserializeObject <T>(message.Payload.Content);

            var procOperator = new ProcessingOperator(message.Payload.Id, _api)
            {
                Reporter = _reporter
            };

            try
            {
                await _logic.ProcessAsync(request, procOperator);
            }
            catch (InterruptConsumingException)
            {
                throw;
            }
            catch (Exception e)
            {
                var completeWithErrorReqDetails = await _api.Request(s => s.CompleteWithErrorAsync(message.Payload.Id, new ProcessingError
                {
                    TechMessage = e.Message,
                    TechInfo    = e.ToString()
                })).GetDetailedAsync();

                _reporter?.Report(completeWithErrorReqDetails);
            }
        }
Beispiel #12
0
        /// <summary>
        /// Processes the incoming return value message from the recipient connection.
        /// </summary>
        /// <param name="message">Message containing the frames for the return value.</param>
        private void ProcessRpcReturn(MqMessage message)
        {
            // Execute the processing on the worker thread.
            Task.Run(() => {
                // Retrieve a serialization cache to work with.
                var serialization = Session.SerializationCache.Get(message);
                try {
                    // Skip message type byte and message type.
                    serialization.MessageReader.Skip(2);

                    // Read the return Id.
                    var return_id = serialization.MessageReader.ReadUInt16();

                    RpcWaitHandle call_wait_handle;
                    // Try to get the outstanding wait from the return id.  If it does not exist, the has already completed.
                    if (LocalWaitHandles.TryRemove(return_id, out call_wait_handle))
                    {
                        call_wait_handle.ReturnMessage = message;

                        // Release the wait event.
                        call_wait_handle.ReturnResetEvent.Set();
                    }
                } finally {
                    Session.SerializationCache.Put(serialization);
                }
            });
        }
 public EventHandlerResult Handle(MqMessage <string> msg)
 {
     //channel.BasicAck(bdea.DeliveryTag, false);
     return(new EventHandlerResult()
     {
         Success = true, MessageAcked = false
     });
 }
        public async Task GetMessageAsync_Batch()
        {
            string message = "my test message";
            string label   = "myLabel";

            PassiveMqQueuClient clientConsumer1    = this.Account.CreateQueueClient("myTestQueue1");
            PassiveMqQueuClient clientConsumer2    = this.Account.CreateQueueClient("myTestQueue2");
            PassiveMqQueuClient clientConsumer3    = this.Account.CreateQueueClient("myTestQueue3");
            PassiveMqQueuClient clientConsumer4    = this.Account.CreateQueueClient("myTestQueue4");
            PassiveMqQueuClient clientConsumerNull = this.Account.CreateQueueClient("myTestQueueNull");

            PassiveMqPublishClient publisher = this.Account.CreatePublishClient();

            try
            {
                await clientConsumer1.DeleteIfExists();

                await clientConsumer1.CrateIfNotExists("/myTestConsumer/aa");

                await clientConsumer2.DeleteIfExists();

                await clientConsumer2.CrateIfNotExists("/myTestConsumer/aa/bb");

                await clientConsumer3.DeleteIfExists();

                await clientConsumer3.CrateIfNotExists("/myTestConsumer/aa/bb/cc");

                await clientConsumer4.DeleteIfExists();

                await clientConsumer4.CrateIfNotExists("/myTestConsumer/bb/4");


                await publisher.Publish("/myTestConsumer/aa/bb/cc/75", new MqCreateMessage(message, label));

                MqMessage message1 = await clientConsumer1.GetMessage();

                MqMessage message2 = await clientConsumer2.GetMessage();

                MqMessage message3 = await clientConsumer3.GetMessage();

                MqMessage message4 = await clientConsumer4.GetMessage();

                Assert.IsNotNull(message1);
                Assert.IsNotNull(message2);
                Assert.IsNotNull(message3);
                Assert.IsNull(message4);
            }
            finally
            {
                await clientConsumer1.DeleteIfExists();

                await clientConsumer2.DeleteIfExists();

                await clientConsumer3.DeleteIfExists();

                await clientConsumer4.DeleteIfExists();
            }
        }
Beispiel #15
0
 public MqBuilder withMessage(MqMessage message)
 {
     if (message == null)
     {
         throw new ArgumentException("传入参数错误");
     }
     this.message = message;
     return(this);
 }
        public async Task Consume(MqMessage <QueueRequestMessage> message)
        {
            await _logic.CompleteWithErrorAsync(message.Payload.Id, new ProcessingError
            {
                TechMessage = "The request was placed in the dead letter"
            });

            _log.Warning("The request was placed in the dead letter")
            .AndFactIs("request-id", message.Payload.Id)
            .Write();
        }
Beispiel #17
0
        public Task Consume(MqMessage <TestMqMsg> message)
        {
            if (Box.RejectedMsg == null)
            {
                Box.RejectedMsg = message;
                throw new Exception("Reject");
            }

            Box.AckMsg = message;
            return(Task.CompletedTask);
        }
Beispiel #18
0
        public async Task <IActionResult> Index()
        {
            var model = new MqMessage
            {
                Id      = 1,
                Message = "Message text"
            };
            await _rmqlClient.PushAsync <TestWorker, MqMessage>(model);

            return(View());
        }
        public void SendHandlerMessage(byte actionId, MqMessage message)
        {
            var headerFrame = Session.CreateFrame(new byte[2], MqFrameType.More);

            headerFrame.Write(0, Id);
            headerFrame.Write(1, actionId);

            var sendMessage = new MqMessage
            {
                headerFrame,
                message
            };

            Session.Send(sendMessage);
        }
Beispiel #20
0
        public static MqMessage <T> Create <T>(ReadOnlyMemory <byte> binBody, IBasicProperties basicProperties)
        {
            var bodyStr = Encoding.UTF8.GetString(binBody.ToArray());
            T   payload;

            if (typeof(T) == typeof(string))
            {
                payload = (T)(object)bodyStr;
            }
            else
            {
                try
                {
                    payload = JsonConvert.DeserializeObject <T>(bodyStr);
                }
                catch (Exception e)
                {
                    throw new JsonMessageSerializationException(bodyStr, e);
                }
            }

            var props = basicProperties;
            var msg   = new MqMessage <T>(payload)
            {
                ReplyTo = props.ReplyTo
            };

            if (Guid.TryParse(props.CorrelationId, out var correlationId))
            {
                msg.CorrelationId = correlationId;
            }
            if (Guid.TryParse(props.MessageId, out var messageId))
            {
                msg.MessageId = messageId;
            }
            if (props.Headers != null)
            {
                msg.Headers = props.Headers
                              .Select(h => new MqHeader
                {
                    Name  = h.Key,
                    Value = h.Value.ToString()
                })
                              .ToArray();
            }

            return(msg);
        }
        static void MqInProcessTest()
        {
            var config = new MqConfig
            {
                Ip   = "127.0.0.1",
                Port = 2828
            };


            Console.WriteLine("FrameBufferSize: {0}; SendAndReceiveBufferSize: {1}\r\n", config.FrameBufferSize,
                              config.SendAndReceiveBufferSize);

            var smallMessage = new MqMessage
            {
                new MqFrame(SequentialBytes(50), MqFrameType.More, config),
                new MqFrame(SequentialBytes(50), MqFrameType.More, config),
                new MqFrame(SequentialBytes(50), MqFrameType.More, config),
                new MqFrame(SequentialBytes(50), MqFrameType.Last, config)
            };

            MqInProcessPerformanceTests(1000000, 5, smallMessage, config);

            var medimumMessage = new MqMessage
            {
                new MqFrame(SequentialBytes(500), MqFrameType.More, config),
                new MqFrame(SequentialBytes(500), MqFrameType.More, config),
                new MqFrame(SequentialBytes(500), MqFrameType.More, config),
                new MqFrame(SequentialBytes(500), MqFrameType.Last, config)
            };

            MqInProcessPerformanceTests(100000, 5, medimumMessage, config);

            var largeMessage = new MqMessage();

            for (int i = 0; i < 20; i++)
            {
                largeMessage.Add(new MqFrame(SequentialBytes(3000), MqFrameType.More, config));
            }

            MqInProcessPerformanceTests(10000, 5, largeMessage, config);

            Console.WriteLine("Performance complete");

            Console.ReadLine();
        }
Beispiel #22
0
        public async Task CorrectlyHandlesOriginalExchangeAsync()
        {
            const string originalExchange   = "original-exchange";
            const string originalRoutingKey = "original-routing-key";

            var msg       = new MyIntegrationEvent();
            var mqMessage = new MqMessage(JsonConvert.SerializeObject(msg), "Type", "1.0", "1.0", "myApp");

            var args = new BasicDeliverEventArgs
            {
                RoutingKey      = "some-key",
                Exchange        = "some-exchange",
                BasicProperties = new FakeOptions
                {
                    Headers = new Dictionary <string, object>
                    {
                        [RetryExtensions.ORIGINAL_EXCHANGE_HEADER]    = Encoding.UTF8.GetBytes(originalExchange),
                        [RetryExtensions.ORIGINAL_ROUTING_KEY_HEADER] = Encoding.UTF8.GetBytes(originalRoutingKey)
                    },
                    ContentType     = "application/json",
                    ContentEncoding = "UTF8"
                },
                Body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(mqMessage))
            };

            var subscriberSettingsDto = new SubscriberSettingsDto("MySubscriberName")
            {
                TracingSettings = new TracingSettingsDto
                {
                    LogWhenMessageIncome = true
                }
            };

            var(_, ctx) = await _subscriber.HandleMessageAsync <MyIntegrationEvent>(
                args,
                x => Task.FromResult <Acknowledgement>(Ack.Ok),
                subscriberSettingsDto.Create(null !)
                );

            Assert.Multiple(() =>
            {
                Assert.AreEqual(originalExchange, ctx.MessageData.Exchange, "Оригинальный обменник не установлен.");
                Assert.AreEqual(originalRoutingKey, ctx.MessageData.RoutingKey, "Оригинальный ключ роутинга не установлен.");
            });
        }
Beispiel #23
0
        /// <summary>
        /// 消息订阅
        /// </summary>
        /// <param name="exchange">交换器</param>
        /// <param name="type">交换器类型</param>
        /// <param name="queue">消息队列</param>
        /// <param name="routingKey">路由键</param>
        internal void Subscribe(string type, string queue, List <string> listRoutingKey)
        {
            try
            {
                string exchange = Config.MqConfig.AppID + "_" + type.ToString().ToLower();
                //信道
                var channel = MqConnection.GetMqConnection().CreateModel();
                //Exchange
                channel.ExchangeDeclare(exchange, type, true, false, null);
                //声明队列
                channel.QueueDeclare(queue, true, false, false, null);
                //队列绑定
                listRoutingKey.ForEach(routingKey =>
                {
                    channel.QueueBind(queue, exchange, routingKey, null);
                });

                //消费者
                var consumer = new EventingBasicConsumer(channel);

                //触发事件
                consumer.Received += (sender, ea) =>
                {
                    var msg = Encoding.UTF8.GetString(ea.Body);

                    MqMessage message = JsonConvert.DeserializeObject <MqMessage>(msg);

                    MessageListening(sender, message);

                    //确认接收
                    channel.BasicAck(ea.DeliveryTag, false);
                };

                //程序主动应答
                channel.BasicConsume(queue: queue,
                                     autoAck: false,
                                     consumer: consumer);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public async Task PeekMessageAsync_Empty()
        {
            PassiveMqQueuClient client = this.Account.CreateQueueClient("myTestQueue");

            await client.DeleteIfExists();

            try
            {
                await client.CrateIfNotExists();

                MqMessage nullMessage = await client.PeekMessage();

                Assert.IsNull(nullMessage);
            }
            finally
            {
                await client.DeleteIfExists();
            }
        }
Beispiel #25
0
        public async Task CorrectlyHandlesPoisonedMessageAsync(int alreadyRetriedCount, bool shouldRetryOneMoreTime)
        {
            var mqMessage = new MqMessage(
                JsonConvert.SerializeObject(new MyIntegrationEvent()),
                "Type",
                "1.0",
                "1.0",
                "myApp"
                );

            var args = new BasicDeliverEventArgs
            {
                DeliveryTag     = 123,
                RoutingKey      = "some-key",
                Exchange        = "some-exchange",
                BasicProperties = new FakeOptions
                {
                    Headers = new Dictionary <string, object>
                    {
                        [PoisonedMessageExtensions.RETRY_CNT_KEY] = alreadyRetriedCount
                    },
                    ContentType     = "application/json",
                    ContentEncoding = "UTF8"
                },
                Body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(mqMessage))
            };

            var subscriberSettingsDto = new SubscriberSettingsDto("MySubscriberName");

            var(acknowledgement, ctx) = await _subscriber.HandleMessageAsync <MyIntegrationEvent>(
                args,
                _ => throw new Exception("Unhandled exception!"),
                subscriberSettingsDto.Create(null !)
                );

            Assert.Multiple(() =>
            {
                Assert.IsInstanceOf <Reject>(acknowledgement, "Тип Acknowledgement некорректен.");
                Assert.AreEqual(args.DeliveryTag, ctx.MessageData.DeliverEventArgs?.DeliveryTag, "DeliveryTag не совпадает.");
                Assert.AreEqual(shouldRetryOneMoreTime, (acknowledgement as Reject)?.Requeue, "ShouldRetryOneMoreTime не совпадает.");
            });
        }
Beispiel #26
0
        public void ShouldNotDeliveryWhenDeadLetterRoutingIsWrong()
        {
            //Arrange
            var deadLetterExchange = TestExchangeFactory.Direct.CreateWithRandomId();
            var deadLetterQueue    = TestQueueFactory.Default.CreateWithRandomId();

            deadLetterQueue.BindToExchange(deadLetterExchange, "bar");

            var queueFactory = new TestQueueFactory
            {
                DeadLetterExchange   = deadLetterExchange.Name,
                DeadLetterRoutingKey = "wrong"
            };
            var queue = queueFactory.CreateWithRandomId();

            //Act
            queue.Publish("foo");

            var msg = queue.Listen <string>();

            msg.Nack();

            MqMessage <string> deadMsg          = null;
            TimeoutException   timeoutException = null;

            try
            {
                deadMsg = deadLetterQueue.ListenAutoAck <string>();
            }
            catch (TimeoutException e)
            {
                timeoutException = e;
            }

            if (timeoutException == null)
            {
                _output.WriteLine("Dead message: " + (deadMsg?.Payload ?? "[null]"));
            }

            //Assert
            Assert.NotNull(timeoutException);
        }
Beispiel #27
0
        public void CompareMessages(MqMessage expected, MqMessage actual)
        {
            try
            {
                // Total frame count comparison.
                Assert.Equal(expected.Count, actual.Count);

                for (int i = 0; i < expected.Count; i++)
                {
                    // Frame length comparison.
                    Assert.Equal(expected[i].DataLength, actual[i].DataLength);

                    Assert.Equal(expected[i].Buffer, actual[i].Buffer);
                }
            }
            catch (Exception e)
            {
                LastException = e;
            }
        }
Beispiel #28
0
        public override bool HandleMessage(MqMessage message)
        {
            if (message[0][0] != Id)
            {
                return(false);
            }

            // Read the type of message.
            var message_type = (RpcCallMessageType)message[0].ReadByte(1);

            switch (message_type)
            {
            case RpcCallMessageType.MethodCancel:

                // Remotely called to cancel a rpc call on this session.
                var           cancellation_id = message[0].ReadUInt16(2);
                RpcWaitHandle wait_handle;
                if (RemoteWaitHandles.TryRemove(cancellation_id, out wait_handle))
                {
                    wait_handle.TokenSource.Cancel();
                }
                break;

            case RpcCallMessageType.MethodCallNoReturn:
            case RpcCallMessageType.MethodCall:
                ProcessRpcCall(message, message_type);
                break;

            case RpcCallMessageType.MethodException:
            case RpcCallMessageType.MethodReturn:
                ProcessRpcReturn(message);
                break;

            default:
                // Unknown message type passed.  Disconnect the connection.
                Session.Close(SocketCloseReason.ProtocolError);
                break;
            }

            return(true);
        }
        public bool HandleMessage(MqMessage message)
        {
            if (message[0][0] != Id)
            {
                Session.Close(SocketCloseReason.ProtocolError);
            }

            // Read the type of message.
            var messageType = message[0].ReadByte(1);

            if (Handlers.ContainsKey(messageType))
            {
                message.RemoveAt(0);
                Handlers[messageType].Invoke(messageType, message);
                return(true);
            }

            // Unknown message type passed.  Disconnect the connection.
            Session.Close(SocketCloseReason.ProtocolError);
            return(false);
        }
        public async Task DeleteMessageAsync_FromCreated()
        {
            PassiveMqQueuClient client = this.Account.CreateQueueClient("myTestQueue");
            await client.DeleteIfExists();

            try
            {
                await client.CrateIfNotExists();

                MqMessage message = await client.AddMessage(new MqCreateMessage("some messagefor MOM"));

                await client.DeleteMessage(message);

                MqMessage newMessage = await client.PeekMessage();

                Assert.IsNull(newMessage);
            }
            finally
            {
                await client.DeleteIfExists();
            }
        }