Example #1
0
        public async Task <IMessageObject> SendMessageAsync(string message)
        {
            IMessageObject m = null;

            channel
            return(m);
        }
Example #2
0
 public bool AddListener(IMessageObject l)
 {
     if (UniqueListener && Listeners.Count != 0)
         return false;
     Listeners.Add(l);
     return true;
 }
Example #3
0
        /// <summary>接收数据</summary>
        /// <returns></returns>
        public virtual IMessageObject Receive()
        {
            // 阻塞方式
            IMessageObject data = null;

            lock (lockObject)
            {
                if (queue == null)
                {
                    InitializeQueue();
                }

                try
                {
                    data = new MessageObject();

                    Message message = queue.Receive(new TimeSpan(0, 0, 10)); // 等待10秒

                    XmlDocument doc = new XmlDocument();

                    doc.LoadXml(message.Body.ToString());

                    data.Deserialize(doc.DocumentElement);

                    return(data);
                }
                catch
                {
                    this.Close();
                }
            }

            return(null);
        }
        /// <summary>发送数据</summary>
        /// <param name="data"></param>
        public virtual void Send(IMessageObject data)
        {
            if (data == null)
            {
                return;
            }

            lock (lockObject)
            {
                if (this.channel == null)
                {
                    InitializeQueue();
                }

                try
                {
                    // 在 MQ 上定义一个持久化队列,如果名称相同不会重复创建
                    channel.QueueDeclare(this.QueueName, true, false, false, null);

                    byte[] bytes = Encoding.UTF8.GetBytes(data.Serializable());

                    // 设置消息持久化
                    IBasicProperties properties = channel.CreateBasicProperties();

                    properties.DeliveryMode = 2;

                    channel.BasicPublish(string.Empty, this.QueueName, properties, bytes);
                }
                catch (Exception ex)
                {
                    MessageQueueManagement.Log.Error(ex.Message, ex);
                }
            }
        }
Example #5
0
        /// <summary>运行</summary>
        public void Run()
        {
            if (running)
            {
                return;
            }

            try
            {
                running = true;

                // 开始时间
                TimeSpan beginTimeSpan = new TimeSpan(DateTime.Now.Ticks);

                // 发送待办
                ServiceTrace.Instance.WriteLine("正在检测是否有任务需要发送。");

                // 接收待办信息

                IMessageObject message = queue.Receive();

                if (message != null)
                {
                    // 发送待办
                    ServiceTrace.Instance.WriteLine("正在发送任务信息。");

                    int count = 0;

                    while (message != null)
                    {
                        if (message is TaskWorkInfo)
                        {
                            TasksContext.Instance.TaskService.Save((TaskWorkInfo)message);

                            count++;
                        }

                        message = queue.Receive();
                    }

                    // 成功发送待办
                    ServiceTrace.Instance.WriteLine("已成功发送【" + count + "】条任务信息。");
                }

                this.nextRunTime = DateTime.Now.AddSeconds(this.interval);

                running = false;
            }
            catch (Exception ex)
            {
                // 发生异常是, 记录异常信息  并把运行标识为false.
                ServiceTrace.Instance.WriteLine(ex.ToString());

                EventLogHelper.Write(string.Format("{0} 监听器发生异常信息\r\n{1}。", this.Name, ex));

                running = false;
            }
        }
Example #6
0
        public void TestReceive()
        {
            IMessageQueueObject messageQueueObject = MessageQueueManagement.GetMessageQueueInstance("MSMQ_Messages");

            if (messageQueueObject.Enabled)
            {
                IMessageObject message = messageQueueObject.Receive();
            }
        }
Example #7
0
 public HEMessage(IMessageObject message)
 {
     Id        = message.Id;
     Message   = message.Message;
     Detail    = message.Detail;
     Type      = message.Type.ToHEMessageType();
     ExtraInfo = message.ExtraInfo;
     HelpRef   = message.HelpRef;
 }
Example #8
0
        public async Task PingAsync(IMessageObject message)
        {
            Task <IMessageObject> sendMessage = message.Channel.SendMessageAsync("wait up...");

            IMessageObject m = await sendMessage;

            Task.WaitAll(sendMessage);

            await m.ModifyAsync($"pong! {(m.CreatedAt - message.CreatedAt).TotalMilliseconds}ms!");
        }
        public static void IfInvoke <TKey>(this IMessageObject <TKey> message, Type exptecedMessageType, Action action)
        {
            Type msgType = message.GetType();

            ThrowOnNotAssignable(typeof(IMessageObject <TKey>), exptecedMessageType);

            if (msgType == exptecedMessageType)
            {
                action();
            }
        }
Example #10
0
        ///<summary>
        /// Execute a Command Async on this message object for all registered receivers.
        ///</summary>
        public async Task CommandAsync(IMessageObject <TKey> message)
        {
            CheckNull(message);
            var tasks = new List <Task>();

            ForAllReceivers(message.Receivers)
            .ForAll
            (
                x => tasks.Add(x.ReceiveCommandAsync(message))
            );

            await Task.WhenAll(tasks);
        }
Example #11
0
        /// <summary>
        /// Updates the state.
        /// </summary>
        /// <param name="state">The state.</param>
        /// <returns></returns>
        public override bool UpdateState(IMessageObject state)
        {
            var result = false;
            var source = state as Outcome;

            if (source != null)
            {
                Status    = source.Status;
                LastError = source.LastError;
                result    = true;
            }
            return(result);
        }
Example #12
0
        public async Task MessageReceived(IMessageObject message)
        {
            foreach (Prefix p in _prefixes)
            {
                if (message.Content.StartsWith(p.Value))
                {
                    string command = message.Content
                                     .Substring(p.Value.Length)
                                     .Split(' ')[0]
                                     .ToLower();

                    if (cachedCommands.ContainsKey(command))
                    {
                        Command commandObject = cachedCommands[command];

                        if (OnPreCommandExecute != null)
                        {
                            if (!await OnPreCommandExecute.Invoke(commandObject))
                            {
                                if (OnPostCommandExecute != null)
                                {
                                    await OnPreCommandFailure.Invoke(commandObject);
                                }
                                return;
                            }
                        }

                        Stopwatch timeTaken = Stopwatch.StartNew();
                        try
                        {
                            await cachedCommands[command].ProcessCommand(message);
                            timeTaken.Stop();

                            if (OnPostCommandExecute != null)
                            {
                                await OnPostCommandExecute(commandObject, timeTaken.ElapsedMilliseconds, true);
                            }
                        }
                        catch (Exception e)
                        {
                            timeTaken.Stop();
                            if (OnPostCommandExecute != null)
                            {
                                await OnPostCommandExecute(commandObject, timeTaken.ElapsedMilliseconds, false);
                            }
                        }
                    }
                }
            }
        }
        public void AddMessage(IMessageObject msg)
        {
            this.Errors.AddRange(msg.Errors);
            this.Warnings.AddRange(msg.Warnings);
            this.Confirmations.AddRange(msg.Confirmations);
            this.Informations.AddRange(msg.Informations);
            if (this.Exception == null)
            {
                this.Exception = msg.Exception;
            }

            if (this.ProcessingStatus && !msg.ProcessingStatus)
            {
                this.ProcessingStatus = msg.ProcessingStatus;
            }
        }
Example #14
0
        public bool Remove(IMessageObject messageObject)
        {
            if (_removeHelper.ContainsKey(messageObject) == false)
            {
                return(false);
            }

            List <eMessage> messages = _removeHelper[messageObject];

            for (int i = 0; i < messages.Count; ++i)
            {
                _messageObjects[(int)messages[i]].Remove(messageObject);
            }

            _removeHelper.Remove(messageObject);

            return(true);
        }
        /// <summary>接收数据</summary>
        /// <returns></returns>
        public override IMessageObject Receive()
        {
            // 阻塞方式
            IMessageObject data = null;

            lock (lockObject)
            {
                if (queue == null)
                {
                    this.queue = this.GetQueueInstance();
                }

                try
                {
                    data = new TaskWorkInfo();

                    // 如果消息队列为空时, 将会导致无限期占用线程, 设置等待10秒钟Receive()函数无响应,则返回空值。
                    Message message = queue.Receive(new TimeSpan(0, 0, 10));

                    XmlDocument doc = new XmlDocument();

                    doc.LoadXml(message.Body.ToString());

                    data.Deserialize(doc.DocumentElement);

                    return(data);
                }
                catch (MessageQueueException messageQueueException)
                {
                    if (messageQueueException.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
                    {
                        // 等待10秒钟Receive()函数无响应,则返回空值。
                        return(null);
                    }

                    throw;
                }
                catch
                {
                    this.Close();
                    throw;
                }
            }
        }
Example #16
0
        public bool Add(eMessage type, IMessageObject messageObject)
        {
            if ((uint)type >= (uint)eMessage.TypeEnd)
            {
                return(false);
            }

            if (_messageObjects[(int)type].Contains(messageObject) == true)
            {
                return(false);
            }

            _messageObjects[(int)type].Add(messageObject);

            if (_removeHelper.ContainsKey(messageObject) == false)
            {
                _removeHelper.Add(messageObject, new List <eMessage>());
            }

            _removeHelper[messageObject].Add(type);

            return(true);
        }
Example #17
0
        /// <summary>异步接收待办信息</summary>
        public void AsyncReceive()
        {
            IMessageObject message = this.queue.Receive();

            while (message != null)
            {
                if (message is TaskWorkInfo)
                {
                    try
                    {
                        this.provider.Save((TaskWorkInfo)message);
                    }
                    catch (Exception ex)
                    {
                        this.queue.Send(message);

                        throw ex;
                    }
                }

                message = this.queue.Receive();
            }
        }
Example #18
0
        /// <summary>发送数据</summary>
        /// <param name="data"></param>
        public virtual void Send(IMessageObject data)
        {
            if (data == null)
            {
                return;
            }

            lock (lockObject)
            {
                try
                {
                    if (queue == null)
                    {
                        this.queue = this.GetQueueInstance();
                    }

                    Message message = new Message();

                    message.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });

                    message.Priority = MessagePriority.Normal; // 消息优先级

                    message.Recoverable = true;                // 可回收的

                    message.Body = data.Serializable();

                    queue.Send(message);
                }
                catch (Exception ex)
                {
                    this.Close();

                    throw ex;
                }
            }
        }
Example #19
0
 /// <summary>
 /// Updates the state.
 /// </summary>
 /// <param name="state">The state.</param>
 /// <returns></returns>
 public virtual bool UpdateState(IMessageObject state)
 {
     throw new NotImplementedException();
 }
 public virtual void ReceiveCommand(IMessageObject <TKey> message)
 => messages[message.GetType()].Invoke(message);
        /// <summary>接收数据</summary>
        /// <returns></returns>
        public virtual IMessageObject Receive()
        {
            // 阻塞方式
            IMessageObject data = null;

            lock (lockObject)
            {
                if (this.channel == null)
                {
                    InitializeQueue();
                }

                try
                {
                    data = new T();

                    BasicGetResult result = channel.BasicGet(this.QueueName, false);

                    if (result == null)
                    {
                        return(null);
                    }
                    else
                    {
                        byte[] bytes = result.Body;

                        XmlDocument doc = new XmlDocument();

                        doc.LoadXml(Encoding.UTF8.GetString(bytes));

                        data.Deserialize(doc.DocumentElement);

                        // 回复确认
                        channel.BasicAck(result.DeliveryTag, false);

                        return(data);
                    }

                    /*
                     * // 回复确认
                     * channel.BasicAck(result.DeliveryTag, false);
                     *
                     * //在MQ上定义一个持久化队列,如果名称相同不会重复创建
                     * channel.QueueDeclare(this.QueueName, true, false, false, null);
                     *
                     * // 输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息
                     * channel.BasicQos(0, 1, false);
                     *
                     * // 在队列上定义一个消费者
                     * QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
                     *
                     * // 消费队列,并设置应答模式为程序主动应答
                     * channel.BasicConsume(this.QueueName, false, consumer);
                     *
                     * // 阻塞函数,获取队列中的消息
                     * // BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
                     * BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.DequeueNoWait(null);
                     * if (ea == null)
                     * {
                     *  return null;
                     * }
                     * else
                     * {
                     *  byte[] bytes = ea.Body;
                     *
                     *  XmlDocument doc = new XmlDocument();
                     *
                     *  doc.LoadXml(Encoding.UTF8.GetString(bytes));
                     *
                     *  data.Deserialize(doc.DocumentElement);
                     *
                     *  // 回复确认
                     *  channel.BasicAck(ea.DeliveryTag, false);
                     *
                     *  return data;
                     * }*/
                }
                catch (Exception ex)
                {
                    MessageQueueManagement.Log.Error(ex.Message, ex);
                }
            }

            return(null);
        }
 public Task ReceiveCommandAsync(IMessageObject <TKey> message)
 => asyncMessages[message.GetType()].InvokeAsync(message);
Example #23
0
 public bool Equals(IMessageObject <string> other)
 {
     throw new NotImplementedException();
 }
Example #24
0
 public bool RemoveListener(IMessageObject l)
 {
     return Listeners.Remove(l);
 }
Example #25
0
 /// <summary>
 /// Removes a listener for a particular message
 /// </summary>
 /// <param name="listener">the listener object</param>
 /// <param name="msg">Message to register to</param>
 /// <returns></returns>
 public bool RmoveListener(IMessageObject listener, String msg)
 {
     if (!_messageTypes.ContainsKey(msg))
     {
         return false;
     }
     return _messageTypes[msg].RemoveListener(listener);
 }
 public Task CommandAsync(IMessageObject <string> message)
 {
     SentMessage = message;
     return(Task.CompletedTask);
 }
 public void Command(IMessageObject <string> message)
 {
     SentMessage = message;
 }
 public bool Equals(IMessageObject <string> other) => other == this;
Example #29
0
 public static void IfInvoke <TKey, ExpectedMessageType>(this IMessageObject <TKey> message, Action action)
     where ExpectedMessageType : IMessageObject <TKey>
 {
     message.IfInvoke(typeof(ExpectedMessageType), action);
 }
 public virtual bool Equals(IMessageObject <TKey> other)
 => Receivers.Equals(other.Receivers) && Sender.Equals(other.Sender);
Example #31
0
 ///<summary>
 /// Execute a Command on this messageObject for all registered receivers in the message
 ///</summary>
 public void Command(IMessageObject <TKey> message)
 {
     CheckNull(message);
     ForAllReceivers(message.Receivers).ForAll(x => x.ReceiveCommand(message));
 }