public bool DeclareResponseCallback(string messageId, Action <string> callback, int?timeout) { bool success = true; try { if (callback == null) { throw new CoreException("Callback is null"); } Trace.TraceInformation($"Declare response callback. MessageId={messageId}"); responceCallbacks.AddOrUpdate(messageId, callback, (k, v) => callback); return(true); } catch (Exception ex) { success = false; throw ex; } finally { if (success && timeout.HasValue) { Task.Delay(timeout.Value).ContinueWith(res => { Action <string> cb; if (responceCallbacks.TryRemove(messageId, out cb) && cb != null) { var errContext = new DataArgs <object>(new CoreException($"Callback timeout expired. MessageId=[{messageId}]")); callback(errContext.ToJson()); } }); } } }
public Task <DataArgs <ViaElement> > ResponseError <T>(DataArgs <T> data) { data.result = false; var data_str = data.ToJson(true); return(Response(data_str)); }
private Task <DataArgs <ViaElement> > RequestAsync <T>(string serviceName, string exchangeType, string queryName, DataArgs <T> queryData, string responceHandlerName, string responseHandlerData, Action <string> callback, MessageEntryParam parameters) { var responseResolve = parameters?.NeedResponseResolve ?? false; //TODO: подумать ExchangeTypes.EXCHANGETYPE_DIRECT для responceHandlers? var responseKind = callback == null ? ExchangeTypes.EXCHANGETYPE_FANOUT : ExchangeTypes.EXCHANGETYPE_DIRECT; var replayTo = responseResolve ? Dispatcher.SelfServiceName : Dispatcher.GetConnectionByExchangeType(responseKind); var queryDataJson = queryData.ToJson(); //записываем текущее состояние запроса var currentViaElement = new ViaElement() { replyTo = replayTo, mqWorkKind = responseKind, messageId = Guid.NewGuid().ToString(), queryHandlerName = queryName, appId = Dispatcher.AppId, priority = parameters?.Priority ?? 0, doResolve = responseResolve, responseHandlerName = responceHandlerName, responseHandlerData = responseHandlerData }; this._via.queue.Push(currentViaElement); var properties = Dispatcher.Connection.CreateChannelProperties(); properties.CorrelationId = ReceivedMessage?.Properties?.CorrelationId ?? parameters?.TransactionId ?? Guid.NewGuid().ToString(); properties.ContentType = currentViaElement.queryHandlerName; properties.MessageId = currentViaElement.messageId; properties.ReplyTo = currentViaElement.replyTo; properties.Priority = currentViaElement.priority == 0 ? (byte)1 : currentViaElement.priority; properties.Headers = new Dictionary <string, object>(); properties.Headers.TryAdd(MessageBasicPropertiesHeaders.VIA, this._via.ToJson()); properties.Headers.TryAdd(MessageBasicPropertiesHeaders.DIRECTION, MessageBasicPropertiesHeaders.DIRECTION_VALUE_REQUEST); properties.Headers.TryAdd(MessageBasicPropertiesHeaders.WORKKIND, responseKind); properties.Headers.TryAdd(MessageBasicPropertiesHeaders.WORKKIND_TYPE, MessageBasicPropertiesHeaders.WORKKIND_TYPE_VALUE); properties.Headers.TryAdd(MessageBasicPropertiesHeaders.VIA_TYPE, MessageBasicPropertiesHeaders.VIA_TYPE_VALUE); exchangeType = ExchangeTypes.Get(exchangeType); var link = LinkTypes.GetLinkByExchangeType(exchangeType); var routingKey = string.Empty; if (exchangeType == ExchangeTypes.EXCHANGETYPE_FANOUT) { routingKey = serviceName; } else if (responseKind == ExchangeTypes.EXCHANGETYPE_DIRECT) { routingKey = parameters?.AppId; if (string.IsNullOrEmpty(routingKey)) { throw new CoreException("Relation [Direct to Direct] - AppId must be initialized"); } } var exchangeName = exchangeType == ExchangeTypes.EXCHANGETYPE_FANOUT ? "" : serviceName; return(Push(currentViaElement, parameters?.NeedRequestResolve ?? true, link, serviceName, exchangeName, routingKey, exchangeType, queryDataJson, properties) .ContinueWith((result) => { if (callback != null) { if (result.Exception != null) { callback(new DataArgs <object>(result.Exception).ToJson()); } else { Dispatcher.DeclareResponseCallback(currentViaElement.messageId, callback, parameters?.Timeout); } } return result.Result; })); }
public Task <DataArgs <ViaElement> > ResponseOk <T>(DataArgs <T> data) { var data_str = data.ToJson(true); return(Response(data_str)); }