/// <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); // } //} }
/// <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); }