using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Threading;
namespace RDH.PharmacyPlatform.Sync.Core
{
///
/// 表示消息客户端的类
///
public sealed class MessageClient
{
#region Fields
private const String _RouteNodeKey = "route";
#endregion
#region Methods
#region Public
///
/// 向服务器发送注册消息
///
public static String Register()
{
MessageData message = new MessageData();
message.SourceId = Bootstrap.Config.LocalNodeId;
message.TargetId = _RouteNodeKey;
message.FilterType = MessageFilterType.Register;
message.MessageContent = JsonSerializer.SerializeObject(new NodeRegisterInfo()
{
NodeId = message.SourceId,
NodeGroupName = Bootstrap.Config.LocalNodeGroup,
IsRegisterIn = true
});
return SendMessage(message);
}
///
/// 向服务器发送注销消息
///
public static String UnRegister()
{
MessageData message = new MessageData();
message.SourceId = Bootstrap.Config.LocalNodeId;
message.TargetId = _RouteNodeKey;
message.FilterType = MessageFilterType.Register;
message.MessageContent = JsonSerializer.SerializeObject(new NodeRegisterInfo()
{
NodeId = message.SourceId,
NodeGroupName = Bootstrap.Config.LocalNodeGroup,
});
return SendMessage(message);
}
///
/// 发送消息
///
public static String SendMessage(MessageData data)
{
if (Bootstrap.Config == null)
{
return "请先进行初始化";
}
//即时将待发送的消息持久化到本地
Bootstrap.Log($"保存待发送的消息, id:{Thread.CurrentThread.ManagedThreadId}");
try
{
Boolean saveFlag;
using (ConnectionSessionScope conn = new ConnectionSessionScope(Bootstrap.DbConnectionString))
{
MessageDataOutDAL messageDataOutDAL = new MessageDataOutDAL();
saveFlag = messageDataOutDAL.InsertModel(data);
}
Bootstrap.Log("保存结果:" + saveFlag.ToString());
return saveFlag ? null : ("保存失败:" + Bootstrap.DbConnectionString);
}
catch (Exception ex)
{
Bootstrap.Log($"{ex.Message}\n{ex.StackTrace}");
return ex.Message;
}
}
#endregion
internal static String InternalSendMessage(MessageData data)
{
if (Bootstrap.Config == null)
{
return "请先进行初始化";
}
try
{
Debug.WriteLine($"发送消息, id:{Thread.CurrentThread.ManagedThreadId}");
String jsonText = JsonSerializer.SerializeObject(data);
Byte[] dataBytes = Encoding.UTF8.GetBytes(jsonText);
//route
// 如果消息中的route是业务路由器,则表示是由业务路由器发送的消息,其物理route等于消息中的route
// 如果消息中的route不是业务路由器,则将物理route改为业务路由器进行中转
//mandatory
// true:表示消息服务器将在ack之前触发return事件
Bootstrap.MqChannel.BasicPublish(String.Empty,
Bootstrap.Config.LocalNodeId == _RouteNodeKey ? data.TargetId : _RouteNodeKey,
true, Bootstrap.ChannelProperties, dataBytes);
}
catch (Exception ex)
{
return ex.Message;
}
return null;
}
#endregion
}
}