Beispiel #1
0
        public static async Task <IMessageContext> SendProto(this IBus bus, IMessageContext message, int timeOut = 3000, SendModes mode = SendModes.Both, CancellationToken cancellationToken = default)
        {
            var result = await bus.Send(message, null, timeOut, mode, cancellationToken);

            if (result as IMessageContext != null)
            {
                return(result as IMessageContext);
            }

            return(MessageContext.Create(result));
        }
Beispiel #2
0
        public async Task <object> Send(object message, string topic = null, int timout = 30000, SendModes mode = SendModes.Both, CancellationToken cancellationToken = default)
        {
            object result = null;

            if (message is null)
            {
                throw new ArgumentNullException(nameof(message));
            }
            if (message as IMessageContext == null)
            {
                message = MessageContext.Create(message, topic);
            }
            var context = message as IMessageContext;

            if (string.IsNullOrWhiteSpace(topic))
            {
                topic = Extensions.GetTopic(message.GetType());
            }
            if (mode != SendModes.ExternalOnly)
            {
                foreach (var h in this.GetSubscriptions(topic).Where(x => x.IsRequestHandler))
                {
                    try
                    {
                        result = await h.Handler(context).TimeoutAfter(30000, cancellationToken);

                        return(result);
                    }
                    catch { }
                }
            }
            if (mode != SendModes.InternalOnly && message as IMessageContext != null && this.rabbit.IsActive)
            {
                /// Try to send to remote
                /// Note that we can only send message contexts...
                //var context = message as IMessageContext;
                try
                {
                    var text = context.Serialize();
                    result = await this.rabbit.Send(Encoding.UTF8.GetBytes(text));
                }
                catch { }
            }
            return(result);
        }