本篇也算是个番外篇了,跟之前几篇关系不算大。之前一篇  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 = ;
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=""/>
<add key="RabbitMQ_VirtualHost" value="ms_mq"/>
</appSettings>

  OK,直接运行一下跑跑吧。到这里基本就把消息经过队列在插入数据库实现了。当然,小小DEMO而已。要学的东东还有很多,继续努力。

ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(八)之 聊天记录入队(列)的更多相关文章

  1. 转载 ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天

    ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天   看起来挺简单,细节还是很多的,好,接上一篇,我们已经成功连接singalR服务器 ...

  2. 转载 ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据

    ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据   最近碰巧发现一款比较好的Web即时通讯前端组件,layim,百度关键字即可,我下面要做的就是基于这个前 ...

  3. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(二) 实现聊天室连接

    上一篇已经简单介绍了layim WebUI即时通讯组件和获取数据的后台方法.现在要讨论的是SingalR的内容,之前都是直接贴代码.那么在贴代码之前先分析一下业务模型,顺便简单讲一下SingalR里的 ...

  4. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(四) 添加表情、群聊功能

    休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开 ...

  5. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据

    最近碰巧发现一款比较好的Web即时通讯前端组件,layim,百度关键字即可,我下面要做的就是基于这个前端组件配合后台完成即时聊天等功能.当然用到的技术就是ASP.NET SingalR框架.本人不会c ...

  6. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(五) 补充:历史记录 和 消息提醒

    有开发者提问怎么做历史记录功能和即使不打开聊天窗口有消息提醒功能.简单抽时间写了点代码.不过只是基本思路,具体细节没有实现. 正如前几篇博客中提到的,读取历史记录什么时候读取呢?按照常理,应该是打开聊 ...

  7. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天

    看起来挺简单,细节还是很多的,好,接上一篇,我们已经成功连接singalR服务器了,那么剩下的内容呢,就是一步一步实现聊天功能. 我们先看看缺什么东西 点击好友弹框之后,要给服务器发消息,进入组Gro ...

  8. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(七)之 图文,附件消息(2016-05-05 12:13)

    上一篇介绍了加好友的流程,这里不再赘述,不过之前的聊天只能发送普通文字,那么本篇就教你如何实现发送附件和图片消息.我们先对功能进行分析: 发送图片,附件,需要实现上传图片和附件的功能. textare ...

  9. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(六)之 好友申请、同意、拒绝

    不知道距离上一篇多久没有写了,可能是因为忙(lan)的关系吧.废话不多说,今天要介绍的不算什么新知识,主要是逻辑上的一些东西.什么逻辑呢,加好友,发送好友申请,对方审批通过,拒绝.(很遗憾,对方审批通 ...

随机推荐

  1. golang context 剖析 1.7.4 版本

    1. 内部结构之 - timerCtx . type timerCtx struct { cancelCtx timer *time.Timer // Under cancelCtx.mu. dead ...

  2. SpringMVC 源码阅读

  3. Nginx+Keepalived配置

    1. Nginx安装 (1) 环境:分别在2台服务器上部署nginx且步骤一致: 如192.138.86.1和192.138.86.2 (2) 下载官网最新稳定版,地址:https://nginx.o ...

  4. 中文输入法无法在 QtCreator(Linux) 中输入汉字

    中文输入法无法在 QtCreator(Linux) 中输入汉字 环境 system: Deepin 15.7 Qt Creator 4.7.0 (GCC 5.3.1) 解决方法 下载 fcitx-qt ...

  5. js 用简单案例举模态对话框弹出

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  6. Juniper 防火墙端口映射设置

    首先我们登陆到juniper防火墙控制界面 默认地址大家都知道(192.168.1.1) 默认用户和密码netsscreen 下面介绍登陆界面: 让我们开始配置吧 依次展开policy → Polic ...

  7. iOS instruments之ui automation的简单使用(高手绕道)

    最近使用了几次instruments中的automation工具,现记录下automation的简单使用方法,希望对没接触过自动化测试又有需求的人有所帮助.  UI 自动测试是iOS 中重要的附加功能 ...

  8. echarts环形图点击旋转并高亮

    通过计算某个扇形区域的值占整个圆的百分比来得到这个扇形的角度,从而根据startAngle这个属性来设定图形的开始渲染的角度,使点击某个扇形时圆环旋转使之始终对准某个点. 期间考虑到某扇形区域太小点击 ...

  9. clearfix为什么用display:table,而不用display:block

    我们都知道clearfix一般这么写: .clearfix:before,.clearfix:after{ content:""; display:table; } .clearf ...

  10. python数据分析工具安装集合

    用python做数据分析离不开几个好的轮子(或称为科学棧/第三方包等),比如matplotlib,numpy, scipy, pandas, scikit-learn, gensim等,这些包的功能强 ...