Пример #1
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="value"></param>
        /// <param name="intercepter"></param>
        /// <param name="timeout_ms"></param>
        /// <param name="tokenSource"></param>
        public async Task SendQ <T>(T value, Func <T, ValueTask <string> > intercepter, int timeout_ms = 1000, CancellationTokenSource tokenSource = null)
        {
            await Task.Delay(0);

            var _correlationId = Guid.NewGuid().ToString();

            var _properties = QChannel.CreateBasicProperties();

            _properties.ReplyTo       = __replyQueueName;
            _properties.CorrelationId = _correlationId;

            var _payload = JsonConvert.SerializeObject(value);

            var _body = Encoding.UTF8.GetBytes(_payload);

            QChannel.BasicPublish(exchange: "", routingKey: QueueName, basicProperties: _properties, body: _body);

            QConsumer.Received += async(model, evtargs) =>
            {
                if (tokenSource != null)
                {
                    if (tokenSource.Token.IsCancellationRequested == true)
                    {
                        tokenSource.Token.ThrowIfCancellationRequested();
                    }
                }

                if (evtargs.BasicProperties.CorrelationId == _correlationId)
                {
                    var _message = Encoding.UTF8.GetString(evtargs.Body);

                    var _result = JsonConvert.DeserializeObject <T>(_message);
                    await intercepter(_result);
                }
            };

            //while (true)
            //{
            //    BasicDeliverEventArgs _evtargs;
            //    if (__consumer.Queue.Dequeue(timeout_ms, out _evtargs) == false)
            //    {
            //        if (tokenSource != null)
            //        {
            //            if (tokenSource.Token.IsCancellationRequested == true)
            //                tokenSource.Token.ThrowIfCancellationRequested();
            //        }

            //        continue;
            //    }

            //    if (_evtargs.BasicProperties.CorrelationId == _correlationId)
            //    {
            //        var _message = Encoding.UTF8.GetString(_evtargs.Body);

            //        var _result = JsonConvert.DeserializeObject<T>(_message);
            //        await intercepter(_result);
            //    }
            //}
        }
Пример #2
0
        /// <summary>
        /// (6) RPC
        /// Remote procedure call implementation
        /// </summary>
        /// <param name="host_name">호스트 명칭</param>
        /// <param name="ip_address"></param>
        /// <param name="virtual_host"></param>
        /// <param name="user_name"></param>
        /// <param name="password"></param>
        /// <param name="queue_name"></param>
        public RpcQ(
            string host_name  = null, string ip_address = null, string virtual_host = null,
            string user_name  = null, string password   = null,
            string queue_name = "remote_procedure_queue"
            )
            : base(host_name, ip_address, virtual_host, user_name, password, queue_name)
        {
            QConnection = CFactory.CreateConnection();
            QChannel    = QConnection.CreateModel();

            __replyQueueName = QChannel.QueueDeclare();

            QConsumer = new EventingBasicConsumer(QChannel);
            QChannel.BasicConsume(__replyQueueName, true, QConsumer);
        }