本篇也算是个番外篇了,跟之前几篇关系不算大。之前一篇  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. GreenPlum 大数据平台--运维(三)

    一,操作命令 01,启动gpstart 参数说明 COMMAND NAME: gpstart Starts a Greenplum Database system. ***************** ...

  2. shell 对字符的求长

    一,测试环境 echo "To the world you may be one person but to one person you may be the world" 对于 ...

  3. Charts in Ionic

    Chart对于任何应用来说都是不可或缺的一部分,hybrid app也是如此. 先罗列一下有哪些可用的Chart library: D3.JS -- Data-Driven Documents,BSD ...

  4. 牛客网Java刷题知识点之数组、链表、哈希表、 红黑二叉树

    不多说,直接上干货! 首先来说一个非常形象的例子,来说明下数组和链表. 上体育课的时候,老师说:你们站一队,每个人记住自己是第几个,我喊到几,那个人就举手,这就是数组. 老师说,你们每个人记住自己前面 ...

  5. oracle 查询及删除表中重复数据

    create table test1( id number, name varchar2(20) ); ,'jack'); ,'jack'); ,'peter'); ,'red'); insert i ...

  6. 白话SpringCloud | 第九章:路由网关(Zuul)的使用

    前言 介绍完分布式配置中心,结合前面的文章.我们已经有了一个微服务的框架了,可以对外提供api接口服务了.但现在试想一下,在微服务框架中,每个对外服务都是独立部署的,对外的api或者服务地址都不是不尽 ...

  7. python实现查询的数据写入到excel

    #coding=utf-8import sysimport xlwtimport pymysql as MySQLdb #这里是python3 如果你是python2.x的话,import MySQL ...

  8. 【VMware】VMware的安装和更改虚拟机默认存储路径

    1.VMware Workstation 14中文破解版安装 网盘下载链接:https://pan.baidu.com/s/1pbDXpgpNQTdTRzzKNWfE1A linux镜像(CentOS ...

  9. 【XShell】xshell 中“快速命令集”的使用

    突然看到朋友的xshell比我多一个按钮,且一点,哈哈哈 ,实现了很炫酷的功能,耐不住好奇,问了一句,原来是快速命令集! 1.选择快速命令集(两种方法a&b) a:文件 > 属性 > ...

  10. C# 自定义属性Attribute

    自定义属性 /// <summary> /// 脱敏属性 /// </summary> public class SensitiveAttribute:Attribute { ...