添加项目文件。
This commit is contained in:
@@ -0,0 +1 @@
|
||||
global using SimpleMQTT;
|
||||
@@ -0,0 +1,91 @@
|
||||
using NewLife.MQTT;
|
||||
using SimpleAdmin.Cache;
|
||||
using SimpleAdmin.Core;
|
||||
using SimpleAdmin.SqlSugar;
|
||||
using SimpleAdmin.System;
|
||||
|
||||
namespace SimpleAdmin.MessageCenter;
|
||||
|
||||
public class MessageWorker : BackgroundService
|
||||
{
|
||||
private readonly ILogger<MessageWorker> _logger;
|
||||
private readonly ISimpleCacheService _simpleCacheService;
|
||||
private readonly IMqttClientManager _mqttClientManager;
|
||||
private readonly MqttClient _mqttClient;
|
||||
|
||||
public MessageWorker(ILogger<MessageWorker> logger, ISimpleCacheService simpleCacheService, IMqttClientManager mqttClientManager)
|
||||
{
|
||||
_logger = logger;
|
||||
_simpleCacheService = simpleCacheService;
|
||||
_mqttClientManager = mqttClientManager;
|
||||
_mqttClient = mqttClientManager.GetClient();
|
||||
}
|
||||
|
||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
//获取延迟队列
|
||||
var queue = _simpleCacheService.GetDelayQueue<long>(CacheConst.CACHE_NOTIFICATION);
|
||||
while (!stoppingToken.IsCancellationRequested)
|
||||
{
|
||||
//一次拿十条,如果拿一条就用queue.TakeOneAsync(-1);-1是超时时间,默认0秒永远阻塞;负数表示直接返回,不阻塞。
|
||||
var data = await queue.TakeOneAsync(-1);
|
||||
if (data != 0)
|
||||
{
|
||||
_logger.LogDebug($"消费者收到消息,消息ID:{data},时间:{DateTime.Now}");
|
||||
var db = DbContext.DB.CopyNew();
|
||||
//获取消息
|
||||
var message = await db.Queryable<SysMessage>().InSingleAsync(data);
|
||||
if (message != null)
|
||||
{
|
||||
message.Status = SysDictConst.MESSAGE_STATUS_ALREADY;
|
||||
//获取待发送的消息
|
||||
var messageUsers = await db.Queryable<SysMessageUser>()
|
||||
.Where(it => it.MessageId == message.Id && it.Status == SysDictConst.MESSAGE_STATUS_READY).ToListAsync();
|
||||
var hasError = false;
|
||||
//开启事务
|
||||
var result = await db.UseTranAsync(async () =>
|
||||
{
|
||||
messageUsers.ForEach(it =>
|
||||
{
|
||||
try
|
||||
{
|
||||
//发送消息
|
||||
_mqttClient.PublishAsync(MqttConst.MQTT_TOPIC_PREFIX + it.UserId, new MqttMessage()
|
||||
{
|
||||
MsgType = MqttConst.MQTT_MESSAGE_NEW,
|
||||
Data = new MessageData()
|
||||
{
|
||||
Subject = message.Subject,
|
||||
Content = message.Content
|
||||
}
|
||||
});
|
||||
it.Status = SysDictConst.MESSAGE_STATUS_ALREADY;
|
||||
it.UpdateTime = DateTime.Now;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
hasError = true;
|
||||
_logger.LogError($"发送消息失败:{e.Message}");
|
||||
}
|
||||
});
|
||||
await db.Updateable(messageUsers).ExecuteCommandAsync();
|
||||
await db.Updateable(message).ExecuteCommandAsync();
|
||||
});
|
||||
//如果有失败的,重写发到延迟队列
|
||||
if (hasError)
|
||||
{
|
||||
_logger.LogDebug($"有失败的消息,重新发到延迟队列");
|
||||
queue.Add(message.Id, 5);
|
||||
}
|
||||
}
|
||||
queue.Acknowledge(data);//告诉队列已经消费了的数据
|
||||
_logger.LogDebug("消费成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogDebug("消费者从队列中没有拿到数据:" + DateTime.Now);
|
||||
await Task.Delay(1000, stoppingToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
try
|
||||
{
|
||||
Console.Title = "SimpleAdmin消息中心服务";
|
||||
}
|
||||
catch
|
||||
{
|
||||
// ignored
|
||||
}//注册服务会报错所以要catch
|
||||
Serve.Run(GenericRunOptions.Default
|
||||
.ConfigureBuilder(hostBuilder =>
|
||||
{
|
||||
hostBuilder.UseWindowsService();//支持注册成服务
|
||||
hostBuilder.ConfigureServices((hostContext, services) =>
|
||||
{
|
||||
services.AddMqttClientManager();//mqtt
|
||||
});
|
||||
return hostBuilder;
|
||||
})
|
||||
);
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||
"profiles": {
|
||||
"SimpleAdmin.MessageCenter": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"environmentVariables": {
|
||||
"DOTNET_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Worker">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<UserSecretsId>dotnet-SimpleAdmin.MessageCenter-031b40d7-f6af-456f-a00c-48f5a3e234de</UserSecretsId>
|
||||
<SatelliteResourceLanguages>en-US</SatelliteResourceLanguages>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup Condition=" '$(TargetFramework)' == 'net8.0'">
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0"/>
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup Condition=" '$(TargetFramework)' == 'net7.0'">
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.0"/>
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="7.0.0"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup Condition=" '$(TargetFramework)' == 'net6.0'">
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0"/>
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0"/>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\SimpleAdmin.System\SimpleAdmin.System.csproj"/>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="SimpleMQTT" Version="1.0.7"/>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0"?>
|
||||
<doc>
|
||||
<assembly>
|
||||
<name>SimpleAdmin.MessageCenter</name>
|
||||
</assembly>
|
||||
<members>
|
||||
</members>
|
||||
</doc>
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
//mqttÉèÖÃ
|
||||
"MqttSettings": {
|
||||
"Host": "127.0.0.1",
|
||||
"Port": 1883,
|
||||
"UserName": "admin",
|
||||
"SecretKey": "admin",
|
||||
"ClientId": "SimpleAdminMessageCenter_Dev"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
//mqttÉèÖÃ
|
||||
"MqttSettings": {
|
||||
"Host": "127.0.0.1",
|
||||
"Port": 1883,
|
||||
"UserName": "admin",
|
||||
"SecretKey": "admin",
|
||||
"ClientId": "SimpleAdminMessageCenter_Pro"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user