本篇也算是个番外篇了,跟之前几篇关系不算大。之前一篇  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. linux-lnmp 搭建报错

    一, 大概就是 没有php-nysql拓展 yum -y install php-mysql 二, 编辑php.ini php.ini中 添加extension=mysql.so PHP.ini 中找 ...

  2. URL篇之URL

    URL(统一资源定位)是网络上使用的资源定位的方案,它是URI(由URL和URN组成)的子集. URL的通用格式 <scheme>://<user>:<password& ...

  3. 【3dsMax安装失败,如何卸载、安装3dMax 2012?】

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  4. Java基础22-Static关键字

    1.static关键字 public class Test{ public static void main(String[] args){ Persion p1=new Persion(); Per ...

  5. (转)SSH批量分发管理&非交互式expect

    目录 1 SSH批量分发管理 1.1 测试环境 1.2 批量管理步骤 1.3 批量分发管理实例 1.3.1 利用sudo提权来实现没有权限的用户拷贝 1.3.2 利用sudo提权开发管理脚本 1.3. ...

  6. 03-struts2获得servetAPI

    1 原理 三个域合一的时候相同的键值对以小的域为准.ActionContext 对象创建:每次请求的时候都会创建一个与请求对应的 ActionContext 对象.ActionContext 销毁:请 ...

  7. Rabbitmq~对Vhost的配置

    rabbitmq里有一些概念我们要清楚,如vhost,channel,exchange,queue等,而前段时间在部署rabbitmq环境时启用了虚拟主机vhost,感觉他主要是起到了消息隔离的作用, ...

  8. JNI与NDK的区别

    JNI是Java调用Native机制,是Java语言自己的特性全称为Java Native Interface,类似的还有微软.Net Framework上的p/invoke,可以让C#或Visual ...

  9. C++ Memory System Part1: new和delete

    在深入探索自定义内存系统之前,我们需要了解一些基础的背景知识,这些知识点是我们接下来自定义内存系统的基础.所以第一部分,让我们来一起深入了解一下C++的new和delete家族,这其中有很多令人吃惊的 ...

  10. [ElasticSearch] 如何使用中文分詞ik與繁簡轉換stconvert插件

    一. 環境安裝 ElasticSearch(以下簡稱ES)安裝已經算相對簡單了, 但要使用需要配置的插件, 對剛入門的新手還是有點麻煩, 所幸medcl大神提供一個配置好的ES-rtf版本, 新手們在 ...