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