Beispiel #1
0
        private void OnReceivedMessage(object i_msg)
        {
            DateTime now = DateTime.Now;
            // Create message so CRC is checked if needed
            EventMessage msg  = new EventMessage(i_msg as byte[]);
            string       sMsg = msg.ToString();

            string sTime = now.ToLongTimeString() + ":" + now.Millisecond;

            if (null != m_tracer)
            {
                m_tracer.Write(sTime + " " + sMsg);

                ListViewItem item = new ListViewItem(sTime, sMsg);
                item.SubItems.Add(msg.ToString());
                m_listView.AddItem(item);

                string sCrack = m_msgCracker.Decode(msg.EventCode.ToString(), msg.DataBytes);
                if (sCrack.Length > 0)
                {
                    ListViewItem item2 = new ListViewItem(sTime, sMsg);
                    item2.SubItems.Add(sCrack);
                    m_listView.AddItem(item2);
                }
            }
        }
Beispiel #2
0
        private static string Send(IntPtr hWnd, EventMessage message)
        {
            string         data = message.ToString();
            int            len  = Encoding.Default.GetBytes(data).Length;
            COPYDATASTRUCT cds;

            cds.dwData = (IntPtr)100;
            cds.lpData = data;
            cds.cbData = len + 1;
            SendMessage(hWnd, WM_COPYDATA, 0, ref cds);
            switch (message.Type)
            {
            case MessageType.GlobalFind:
            case MessageType.GlobalOpen:
            case MessageType.GlobalMQ:
            case MessageType.GlobalIO:

                using (var read = MMF_READER.CreateViewStream())
                {
                    byte[] buffer = new byte[4];
                    read.Read(buffer, 0, buffer.Length);
                    var length = BitConverter.ToInt32(buffer, 0);
                    if (length <= 0)
                    {
                        return(string.Empty);
                    }
                    buffer = new byte[length];
                    read.Read(buffer, 0, buffer.Length);
                    return(Encoding.UTF8.GetString(buffer));
                }

            default:
                return(string.Empty);
            }
        }
Beispiel #3
0
 /// <summary>
 /// 重发该消息
 /// </summary>
 /// <param name="topic"></param>
 /// <param name="msgData"></param>
 private void RetryPublish(String topic, EventMessage msgData, Exception ex)
 {
     if (retryTimes < MaxRetryTimes)
     {
         lock (syncObj)
         {
             retryTimes++;
             XTrace.WriteLine($"发送消息:{msgData.ToString()} 失败,进行第 {retryTimes} 重试。");
             Publish(topic, msgData);
         }
     }
     else
     {
         PushRepublishMessage(topic, msgData);
         producers.Remove(topic); // 移除该消息生产者,下次重新生成一个
         throw ex;
     }
 }
Beispiel #4
0
        public void it_should_parse_event_messages(string input, EventName eventName)
        {
            var parser   = new Parser();
            var rawInput = input.Replace("\r\n", "\n") + "\n\n";

            foreach (char c in rawInput)
            {
                parser.Append(c);
            }

            Assert.True(parser.Completed);

            var eventMessage = new EventMessage(parser.ExtractMessage());

            Assert.NotNull(eventMessage);
            Assert.Equal(eventName, eventMessage.EventName);

            Console.WriteLine(eventMessage.ToString());
        }
Beispiel #5
0
        /// <summary>
        /// 发送指定主题的消息
        /// </summary>
        /// <param name="topic">The topic.</param>
        /// <param name="message">The MSG data.</param>
        /// <param name="priority">The priority.</param>
        /// <exception cref="System.Exception"></exception>
        public void Publish(string topic, EventMessage message, MQPriority priority = MQPriority.Normal)
        {
            var producer = GetProducer(topic);

            if (producer == null)
            {
                throw new Exception($"不存在主题为 {topic} 的消息发布者。");
            }

            try
            {
                ITextMessage msg = producer.CreateTextMessage();
                msg.Text = message.ToJson();
                foreach (var kv in message.Data)
                {
                    msg.Properties.SetString(kv.Key, kv.Value);
                }
                producer.Send(msg, MsgDeliveryMode.Persistent, (MsgPriority)priority, TimeSpan.MinValue); // 发送消息
                retryTimes = 0;                                                                           // 重置失败重试次数
            }
            catch (IOException ex) {
                XTrace.WriteLine($"发布消息 {topic} 失败,消息内容:{message.ToString()}。");
                XTrace.WriteException(ex);
                Thread.Sleep(1000 * 60); // 延迟1分钟后再试
                RetryPublish(topic, message, ex);
            }
            catch (ConnectionClosedException ex) {
                XTrace.WriteException(ex);
                Thread.Sleep(1000 * 10); // 延迟10秒钟再试
                RetryPublish(topic, message, ex);
            }
            catch (Exception ex) {
                XTrace.WriteException(ex);
                PushRepublishMessage(topic, message);
                producers.Remove(topic);
                throw ex;
            }
        }