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而已。要学的东东还有很多,继续努力。

原文地址:https://www.cnblogs.com/panzi/p/5526313.html