ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(八)之 聊天记录入队(列)
本篇也算是个番外篇了,跟之前几篇关系不算大。之前一篇 RabbitMQ .NET Client 实战实验 里有介绍过今天要用的内容。
做了一下小更改,就是在用户聊天的时候,消息记录不直接进入数据库,而是进入队列。然后等待队列逐条处理进入数据库。队列的好处就是确保每条都能得到正确处理,如果数据插入失败,也不会出现数据丢失的情况。(很遗憾我自己还没实现处理失败的情况)
直接进入正题,先新建一个项目,引入相应的dll
ChatQueue代码:
public sealed class ChatQueue { /// <summary> /// 聊天消息队列名称 /// </summary> const string QueueName = "LAYIM_CHAT_MSG_QUEUE"; /// <summary> /// 接收到队列消息,进行处理 /// </summary> public static void StartListeningChat() { IMessageCustomer customer = new MessageCustomer(QueueName); //开始消息监听 customer.StartListening(); //接收到消息后的回调 customer.ReceiveMessageCallback = message => { //反序列化消息实体 var msgModel = JsonHelper.DeserializeObject<ChatMessageResult>(message); //调用方法插入数据库(这里没判断是否具体插入成功,只为测试,默认都按照成功处理) UserBLL.AddMessage(msgModel);
/*经过本人验证,如果这里返回false,队列不会继续处理下一条消息,我目前的思路是,如果有一条出现了异常,那么还是返回true,
不过将异常的消息记录日志或者放入另一条队列集中处理,防止影响下一条记录的插入,正常情况下,如果出现一个问题,很有可能都是这个问题,
至于其他机制,目前正在研究中。。。
*/ return true; }; } /// <summary> /// 队列消息发布 /// </summary> /// <param name="message"></param> public static void PublishMessage(ChatMessageResult message) { IMessageProduct product = new MessageProduct(QueueName); //将消息序列化之后,发布到队列 var strMessage = JsonHelper.SerializeObject(message); product.Publish(strMessage); } }
然后在Startup文件中开启队列监听:
//开启队列监听 ChatQueue.StartListeningChat();
最后在修改Hub中的代码:
var groupId = MessageHelper.GetGroupName(result.fromuser.id, result.touser.id); result.groupid = groupId; result.type = Config.Chat_One;//1v1 result.msgtype = MessageType.Custom;//聊天消息,非系统消息 result.status = 1; result.msgid = Guid.NewGuid().ToString(); //发送给队列 ChatQueue.PublishMessage(result); /* //如果没有队列的话,就将上边的注释掉然后切换到直接添加到数据库 //UserBLL.AddMessage(result); */ //发送给客户端 return Clients.Group(groupId).receiveMessage(result);
还有,一定要记得配置好相应的队列信息:
<appSettings> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> <!--RabbitMQ--> <add key="RabbitMQ_HostUri" value="amqp://192.168.1.119:5672/"/> <add key="RabbitMQ_HostName" value="192.168.1.119"/> <add key="RabbitMQ_UserName" value="test_user"/> <add key="RabbitMQ_Password" value="123456"/> <add key="RabbitMQ_VirtualHost" value="ms_mq"/> </appSettings>
OK,直接运行一下跑跑吧。到这里基本就把消息经过队列在插入数据库实现了。当然,小小DEMO而已。要学的东东还有很多,继续努力。
多学点,总不会吃亏的。