电子药箱通讯服务端
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

MessageClient.cs 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Diagnostics;
  6. using System.Threading.Tasks;
  7. using System.Threading;
  8. namespace RDH.PharmacyPlatform.Sync.Core
  9. {
  10. /// <summary>
  11. /// 表示消息客户端的类
  12. /// </summary>
  13. public sealed class MessageClient
  14. {
  15. #region Fields
  16. private const String _RouteNodeKey = "route";
  17. #endregion
  18. #region Methods
  19. #region Public
  20. /// <summary>
  21. /// 向服务器发送注册消息
  22. /// </summary>
  23. public static String Register()
  24. {
  25. MessageData message = new MessageData();
  26. message.SourceId = Bootstrap.Config.LocalNodeId;
  27. message.TargetId = _RouteNodeKey;
  28. message.FilterType = MessageFilterType.Register;
  29. message.MessageContent = JsonSerializer.SerializeObject(new NodeRegisterInfo()
  30. {
  31. NodeId = message.SourceId,
  32. NodeGroupName = Bootstrap.Config.LocalNodeGroup,
  33. IsRegisterIn = true
  34. });
  35. return SendMessage(message);
  36. }
  37. /// <summary>
  38. /// 向服务器发送注销消息
  39. /// </summary>
  40. public static String UnRegister()
  41. {
  42. MessageData message = new MessageData();
  43. message.SourceId = Bootstrap.Config.LocalNodeId;
  44. message.TargetId = _RouteNodeKey;
  45. message.FilterType = MessageFilterType.Register;
  46. message.MessageContent = JsonSerializer.SerializeObject(new NodeRegisterInfo()
  47. {
  48. NodeId = message.SourceId,
  49. NodeGroupName = Bootstrap.Config.LocalNodeGroup,
  50. });
  51. return SendMessage(message);
  52. }
  53. /// <summary>
  54. /// 发送消息
  55. /// </summary>
  56. public static String SendMessage(MessageData data)
  57. {
  58. if (Bootstrap.Config == null)
  59. {
  60. return "请先进行初始化";
  61. }
  62. //即时将待发送的消息持久化到本地
  63. Bootstrap.Log($"保存待发送的消息, id:{Thread.CurrentThread.ManagedThreadId}");
  64. try
  65. {
  66. Boolean saveFlag;
  67. using (ConnectionSessionScope conn = new ConnectionSessionScope(Bootstrap.DbConnectionString))
  68. {
  69. MessageDataOutDAL messageDataOutDAL = new MessageDataOutDAL();
  70. saveFlag = messageDataOutDAL.InsertModel(data);
  71. }
  72. Bootstrap.Log("保存结果:" + saveFlag.ToString());
  73. return saveFlag ? null : ("保存失败:" + Bootstrap.DbConnectionString);
  74. }
  75. catch (Exception ex)
  76. {
  77. Bootstrap.Log($"{ex.Message}\n{ex.StackTrace}");
  78. return ex.Message;
  79. }
  80. }
  81. #endregion
  82. internal static String InternalSendMessage(MessageData data)
  83. {
  84. if (Bootstrap.Config == null)
  85. {
  86. return "请先进行初始化";
  87. }
  88. try
  89. {
  90. Debug.WriteLine($"发送消息, id:{Thread.CurrentThread.ManagedThreadId}");
  91. String jsonText = JsonSerializer.SerializeObject(data);
  92. Byte[] dataBytes = Encoding.UTF8.GetBytes(jsonText);
  93. //route
  94. // 如果消息中的route是业务路由器,则表示是由业务路由器发送的消息,其物理route等于消息中的route
  95. // 如果消息中的route不是业务路由器,则将物理route改为业务路由器进行中转
  96. //mandatory
  97. // true:表示消息服务器将在ack之前触发return事件
  98. Bootstrap.MqChannel.BasicPublish(String.Empty,
  99. Bootstrap.Config.LocalNodeId == _RouteNodeKey ? data.TargetId : _RouteNodeKey,
  100. true, Bootstrap.ChannelProperties, dataBytes);
  101. }
  102. catch (Exception ex)
  103. {
  104. return ex.Message;
  105. }
  106. return null;
  107. }
  108. #endregion
  109. }
  110. }