【aspnetcore】用ConcurrentQueue实现一个简单的队列系统
第一步:定义队列服务接口
public interface ISimpleQueueServer
{
/// <summary>
/// 添加队列消息
/// </summary>
/// <param name="message">消息</param>
/// <param name="clientName">客户端名称</param>
/// <returns></returns>
string Add(string message, string clientName);
}
第二步:添加队列服务接口的实现
public class SimpleQueueServer : ISimpleQueueServer
{
/// <summary>
/// 队列
/// </summary>
private static ConcurrentQueue<string> _queue = new ConcurrentQueue<string>(); /// <summary>
/// 日志
/// </summary>
private static ILogger _log; /// <summary>
/// 后台任务
/// </summary>
private static Task _task; /// <summary>
/// 连续获取队列为空的次数
/// </summary>
private int EmptyRepeatCount = 0; /// <summary>
/// 属性,后台任务
/// </summary>
private Task MyTask
{
get
{
if (_task == null)
{
_task = new Task(MessageHandler);
}
return _task;
}
} /// <summary>
/// 构造函数
/// </summary>
/// <param name="factory"></param>
public SimpleQueueServer(ILoggerFactory factory)
{
if (_log == null)
{
_log = factory.CreateLogger("SimpleQueueServer");
} MyTask.Start();
} /// <summary>
/// 添加消息到队列
/// </summary>
/// <param name="message">消息</param>
/// <param name="clientName">发送的客户端名称</param>
/// <returns></returns>
public string Add(string message, string clientName = "")
{
try
{
string prefix = string.IsNullOrWhiteSpace(clientName) ? "" : $"【{clientName}】";
_queue.Enqueue($"{prefix}{message}");
return "OK";
}
catch (Exception ex)
{
_log.LogError(ex, "向队列添加信息失败");
return ex.Message;
}
} /// <summary>
/// 队列中要实现的任务
/// </summary>
/// <param name="threadName">线程名称,如果多</param>
/// <returns></returns>
private Action MessageHandler => () =>
{
while (true)
{
try
{
if (_queue.IsEmpty)
{
_log.LogDebug($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 队列为空");
Thread.Sleep(3000);
}
else
{
if (_queue.TryDequeue(out string result))
{
_log.LogDebug($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 获取到数据:{result}");
}
else
{
_log.LogDebug($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 尝试从队列获取消息失败");
}
Thread.Sleep(500);
}
}
catch (Exception ex)
{
_log.LogError(ex, "系统错误");
}
}
};
}
第三步:在startup中注册服务,这里稍稍装个x,定义一个IServiceCollection扩展,让代码看起来x格稍微高点
public static class ServiceCollectionExtension
{
public static void AddSimpleQueueServer(this IServiceCollection services)
{
services.AddSingleton<ISimpleQueueServer, SimpleQueueServer>((provider) =>
{
return new SimpleQueueServer(provider.GetService<ILoggerFactory>());
});
}
}
第四步:在startup的ConfigureServices中添加服务
services.AddSimpleQueueServer();
第五步:修改appsettings.Development.json文件
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Warning",
"Microsoft": "Warning"
}
}
}
修改System和Microsoft的日志级别,防止调试时队列显示的消息淹没在无穷无尽的info中。
=======无聊的分割线======
新建一个QueueController
namespace AspnetCoreMvcStudy.Controllers
{
public class QueueController : Controller
{
private ISimpleQueueServer _server; public QueueController(ISimpleQueueServer server)
{
_server = server;
} public IActionResult Index()
{
return View();
} [HttpPost]
public JsonResult Send(string msg, string client)
{
for (int i = 0; i < 100; i++)
{
_server.Add($"{msg}-{i}", client);
}
return Json(new { Code = 200 });
}
}
}
创建视图 Index.cshtml
@{
ViewData["Title"] = "Index";
} <h2>队列测试</h2> <form id="form1" onsubmit="return false;">
<div class="form-group">
<label for="message">客户端名称</label>
<input type="text" id="client" value="" />
<label for="message">发送内容</label>
<input type="text" id="message" value="" />
<hr />
<button id="btnSubmit" class="btn btn-success">发送</button>
<span class="text-danger" id="info"></span>
</div>
</form> @section scripts
{
<script>
$('#btnSubmit').on('click', function () {
var that = $(this);
that.attr('disabled', 'disabled');
$.post('/Queue/Send', { msg: $('#message').val(), client: $('#client').val() }, function (response) {
if (response.code == 200) {
$('#info').text('发送成功');
} else {
$('#info').text(response.message);
}
that.removeAttr('disabled');
});
});
</script>
}
运行程序,开整
【aspnetcore】用ConcurrentQueue实现一个简单的队列系统的更多相关文章
- 《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE ...
- Linux第三周学习总结——构造一个简单的Linux系统MenuOS
第三周学习总结--构造一个简单的Linux系统MenuOS 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...
- Python高级编程之生成器(Generator)与coroutine(四):一个简单的多任务系统
啊,终于要把这一个系列写完整了,好高兴啊 在前面的三篇文章中介绍了Python的Python的Generator和coroutine(协程)相关的编程技术,接下来这篇文章会用Python的corout ...
- Linux内核设计第三周——构造一个简单的Linux系统
Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核 ...
- 第三节 构造一个简单的Linux系统MenuOS——20135203齐岳
第三节 构造一个简单的Linux系统MenuOS By 20135203齐岳 Linux内核源代码 arch/ 支持不同cpu的源代码 Documentations/ 文档存储 init/ 内核启动相 ...
- Linux内核分析第三周学习总结:构造一个简单的Linux系统MenuOS
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内 ...
- 一个简单的CS系统打包过程图文版
一个简单的CS系统打包过程图文版 1. 打包内容 1.1. 此次打包的要求和特点 主工程是一个CS系统: 此CS系统运行的先决条件是要有.Net Framework 3.5: 主工程安装完成 ...
- Linux下一个简单的日志系统的设计及其C代码实现
1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息, 包括:变量名称及其值.消息结构定义.函数返回 ...
- python制作一个简单的中奖系统
注释: 展示图下的代码,我是用pycharm写的,是python解释器中的一种,本课没不同解释器的要求,可根据自己喜欢的解释器编写. 步骤: 本期给大家带来的是,一个简单的中奖系统,首先打开自己电脑上 ...
随机推荐
- Codeforces Round #376 (Div. 2) D. 80-th Level Archeology —— 差分法 + 线段扫描法
题目链接:http://codeforces.com/contest/731/problem/D D. 80-th Level Archeology time limit per test 2 sec ...
- Codeforces Round #374 (Div. 2) C. Journey —— DP
题目链接:http://codeforces.com/contest/721/problem/C C. Journey time limit per test 3 seconds memory lim ...
- SpringMVC与Struts2区别与比较
1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上Spr ...
- IPFS中文简介
ipfs是什么? 它是一个协议也是一个网络,已经运行了2年半,并非虚无缥缈的空气. 它像比特币网络一样,并没有发明什么新技术,他只是将很多种技术(P2P网络技术,bt传输技术,Git版本控制,自证明文 ...
- html5--5-8 绘制圆/弧
html5--5-8 绘制圆/弧 学习要点 掌握绘制圆弧的方法 矩形的绘制方法 rect(x,y,w,h)创建一个矩形 strokeRect(x,y,w,hx,y,w,h) 绘制矩形(无填充) fil ...
- CentOS6.5 yum源设置
在安装完CentOS后一般需要修改yum源,才能够在安装更新rpm包时获得比较理想的速度. 国内比较快的有163源.sohu源.这里以163源为例子. 1. cd /etc/yum.repos.d 2 ...
- RTMP协议的理解
RTMP协议:real time message protocol 工作原理: 先采集摄像头视频和麦克风音频信息,再进行音视频的编码(mpeg),通过FMLE(Flash Media Live Enc ...
- 关于yolo 模型中1X1卷积层的作用
1X1卷积层的作用: 1.实现跨通道的交互和信息整合.2.进行卷积核通道数的降维和升维.3.就是可以在保持feature map 尺寸不变(即不损失分辨率)的前提下大幅增加非线性特性,把网络做得很de ...
- JavaScript-Tool:jquery.qrcode.js
ylbtech-JavaScript-Tool:jquery.qrcode.js 1.返回顶部 1. 插件描述:jquery.qrcode.js 是一个能够在客户端生成矩阵二维码QRCode 的jqu ...
- js事件触发器fireEvent和dispatchEvent
转自:https://www.cnblogs.com/tiger95/p/6962059.html 事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome, ...