/// <summary> /// 发布消息 /// </summary> /// <param name="topic">消息主题</param> /// <param name="message">消息体,注意所有发布的消息均须为EventMessage的子类,方便事件总线底层进行通讯处理。</param> /// <param name="priority">消息优先级</param> public void Publish(string topic, EventMessage message, MQPriority priority = MQPriority.Normal) { var publisher = GetTopic(topic); if (publisher == null) { return; } // 发送消息 switch (message.Action) { // 发送短信 case "SMS": SendSms(message, publisher); break; case "MAIL": SendMail(message, publisher); break; default: publisher.PublishMessage(message.ToJson()); // 默认情况下直接将消息发送出去 break; } }
/// <summary> /// 发送消息 /// </summary> /// <param name="topic"></param> /// <param name="message"></param> /// <param name="priority"></param> public void Publish(string topic, EventMessage message, MQPriority priority = MQPriority.Normal) { try { bus.Publish(message, conf => conf.WithPriority((Byte)priority) .WithTopic(topic)); } catch (Exception ex) { XTrace.WriteLine($"发送消息 {topic} - {message.ToJson()} 失败。"); XTrace.WriteException(ex); throw ex; } }
/// <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; } }