zoukankan      html  css  js  c++  java
  • 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而已。要学的东东还有很多,继续努力。

  • 相关阅读:
    敏捷个人2013.06月份户外活动报道:奥森健步读书分享会
    敏友的【敏捷个人】有感(16): 成为一个敏捷的人
    #敏捷个人# 每日认识101(14):成为一个敏捷个人
    4周的敏捷生活练习,你来吗?
    OKGo vs RxHttpUtils ...
    Android开发之EditText多行文本输入
    android开发中json与java对象相互转换
    android 调试崩溃Unable to instantiate application的解决方法
    Android.mk 使用说明
    几种知名开源富文本编辑器记录和对比(仅供参考)
  • 原文地址:https://www.cnblogs.com/panzi/p/5526313.html
Copyright © 2011-2022 走看看