.NetCore利用BlockingCollection实现简易消息队列
前言
消息队列现今的应用场景越来越大,常用的有RabbmitMQ和KafKa。
我们用BlockingCollection来实现简单的消息队列。
实现消息队列
用Vs2017创建一个控制台应用程序。创建DemoQueueBlock类,封装一些常用判断。
HasEle,判断是否有元素
Add向队列中添加元素
Take从队列中取出元素
为了不把BlockingCollection直接暴漏给使用者,我们封装一个DemoQueueBlock类
/// <summary>
/// BlockingCollection演示消息队列
/// </summary>
/// <typeparam name="T"></typeparam>
public class DemoQueueBlock<T> where T : class
{
private static BlockingCollection<T> Colls;
public DemoQueueBlock()
{
}
public static bool IsComleted() {
if (Colls != null && Colls.IsCompleted) {
return true;
}
return false;
}
public static bool HasEle()
{
if (Colls != null && Colls.Count>0)
{
return true;
}
return false;
}
public static bool Add(T msg)
{
if (Colls == null)
{
Colls = new BlockingCollection<T>();
}
Colls.Add(msg);
return true;
}
public static T Take()
{
if (Colls == null)
{
Colls = new BlockingCollection<T>();
}
return Colls.Take();
}
}
/// <summary>
/// 消息体
/// </summary>
public class DemoMessage
{
public string BusinessType { get; set; }
public string BusinessId { get; set; }
public string Body { get; set; }
}
添加元素进队列
通过控制台,添加元素
//添加元素
while (true)
{
Console.WriteLine("请输入队列");
var read = Console.ReadLine();
if (read == "exit")
{
return;
}
DemoQueueBlock<DemoMessage>.Add(new DemoMessage() { BusinessId = read });
}
消费队列
通过判断IsComleted,来确定是否获取队列
Task.Factory.StartNew(() =>
{
//从队列中取元素。
while (!DemoQueueBlock<DemoMessage>.IsComleted())
{
try
{
var m = DemoQueueBlock<DemoMessage>.Take();
Console.WriteLine("已消费:" + m.BusinessId);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
});
查看运行结果
运行结果
这样我们就实现了简易的消息队列。
示例源码
参考链接
BlockingCollection
Orleans源码分析
.NetCore利用BlockingCollection实现简易消息队列的更多相关文章
- php 利用activeMq+stomp实现消息队列
php 利用activeMq+stomp实现消息队列 一.activeMq概述 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J ...
- 八.利用springAMQP实现异步消息队列的日志管理
经过前段时间的学习和铺垫,已经对spring amqp有了大概的了解.俗话说学以致用,今天就利用springAMQP来完成一个日志管理模块.大概的需求是这样的:系统中有很多地方需要记录操作日志,比如登 ...
- (转)java redis使用之利用jedis实现redis消息队列
应用场景 最近在公司做项目,需要对聊天内容进行存储,考虑到数据库查询的IO连接数高.连接频繁的因素,决定利用缓存做. 从网上了解到redis可以对所有的内容进行二进制的存储,而java是可以对所有对象 ...
- Redis 简易消息队列
为了保持程序的高效,建议使用ProtoBuf. Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48, ...
- [资源]PHP使用消息队列
利用PHP操作Linux消息队列完成进程间通信 基于HTTP协议的轻量级开源简单队列服务:HTTPSQS[原创] Redis队列——PHP操作简单示例 入队操作 <?php $redis = n ...
- Redis+php-resque实现消息队列
服务器硬件配置 Dell PowerEdge R310英特尔单路机架式服务器 Intel Xeon Processor X3430 2.4GHz, 8MB Cache 8GB内存(2 x 4GB) ...
- php中对共享内存,消息队列的操作
http://www.cnblogs.com/fengwei/archive/2012/09/12/2682646.html php作为脚本程序,通常生命周期都很短,如在web应用中,一次请求就是ph ...
- php消息队列
Memcache 一般用于缓存服务.但是很多时候,比如一个消息广播系统,需要一个消息队列.直接从数据库取消息,负载往往不行.如果将整个消息队列用一个key缓存到memcache里面.对于一个很大的消息 ...
- RabbitMQ消息队列名词解释[转]
从AMQP协议可以看出,MessageQueue.Exchange和Binding构成了AMQP协议的核心,下面我们就围绕这三个主要组件 从应用使用的角度全面的介绍如何利用Rabbit MQ构建 ...
随机推荐
- 运维利器万能的 strace
strace是什么? 按照strace官网的描述, strace是一个可用于诊断.调试和教学的Linux用户空间跟踪器.我们用它来监控用户空间进程和内核的交互,比如系统调用.信号传递.进程状态变更等. ...
- PyQt5--Buttons
# -*- coding:utf-8 -*- ''' Created on Sep 13, 2018 @author: SaShuangYiBing ''' import sys from PyQt5 ...
- Swift 并行编程现状和展望 - async/await 和参与者模式
这篇文章不是针对当前版本 Swift 3 的,而是对预计于 2018 年发布的 Swift 5 的一些特性的猜想.如果两年后我还记得这篇文章,可能会回来更新一波.在此之前,请当作一篇对现代语言并行编程 ...
- 计数dp
计数dp 计数类的$dp$没做过几个,所以之前都放到"思维"标签下了,后来发现原来这属于一类问题啊...搬过来了. 管道取珠:https://www.lydsy.com/Judge ...
- android studio 错误: InnerClass annotations are missing corresponding EnclosingMember annotations. Such InnerClass annotations are ignored
android studio 错误: InnerClass annotations are missing corresponding EnclosingMember annotations. Suc ...
- oracle 创建create user 及授权grant 查看登陆的用户
show user; select sys_context('userenv','session_user') from dual; select user from dual; 查看所有登录的用户必 ...
- Node.js实战(十一)之Buffer
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...
- Android—将Bitmap图片保存到SD卡目录下或者指定目录
直接上代码就不废话啦 一:保存到SD卡下 File file = new File(Environment.getExternalStorageDirectory(), System.currentT ...
- Spring framework3.2整合hibernate4.1报错:No Session found for current thread
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransact ...
- C#中使用WeiFenLuo.WinFormsUI.Docking.dll实现窗口停靠效果
很酷的效果,很值得好好去学习的哈. 重置工具箱: 新建一个WinForm程序,项目名称为TestDockPanelControl.选中Form1窗体后选择工具箱--->>新建个添加选项卡命 ...