postgresql 创建listen notify .net core6.0监听连接

news/2024/5/19 22:08:48 标签: postgresql, .netcore, 数据库

背景:数据库某张表定时有第三方更新到实时表里,收到数据更新以后,WEBSOCKET发送前端

-- 创建一个发送通知的函数
CREATE OR REPLACE FUNCTION notify_event(event_name text) RETURNS void AS $$
BEGIN
  PERFORM pg_notify(event_name, '');
END;
$$ LANGUAGE plpgsql;

-- 创建一个触发器,在数据变化时调用通知函数
CREATE OR REPLACE FUNCTION notify_trigger() RETURNS trigger AS $$
BEGIN
  PERFORM notify_event('data_changed');
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;
 

-- 在需要监听的表上创建触发器
CREATE TRIGGER data_change_trigger
AFTER INSERT OR UPDATE OR DELETE ON river_area
FOR EACH ROW
EXECUTE FUNCTION notify_trigger();
 

.net core创建一个后台运行服务

using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Npgsql;

namespace Pipe.BLL
{
    public class TableUpdateListenerService : BackgroundService
    {
        private readonly IServiceProvider _services;

        public TableUpdateListenerService(IServiceProvider services)
        {
            _services = services;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            using var scope = _services.CreateScope();
            var serviceProvider = scope.ServiceProvider;

            var connectionString = serviceProvider.GetRequiredService<IConfiguration>().GetConnectionString("LocalNpgsqlConnection");

            using var conn = new NpgsqlConnection(connectionString);
            await conn.OpenAsync(stoppingToken);

            using var cmd = new NpgsqlCommand("listen data_changed", conn);
            cmd.ExecuteNonQuery();

            conn.Notification += (sender, e) =>
            {
                Console.WriteLine($"Received table update notification: {e.Payload}");
                // 在这里执行相应的操作,处理接收到的通知
            };

            while (!stoppingToken.IsCancellationRequested)
            {
                using var transaction = conn.BeginTransaction();
                await transaction.CommitAsync();
                await Task.Delay(TimeSpan.FromSeconds(1), stoppingToken); // 可以选择适当的延迟时间
            }
        
        }
    }
}

startup.cs注册下服务   services.AddHostedService<TableUpdateListenerService>();

psql 发送测试。


UPDATE "public"."river_area" SET "objectid" = 5 WHERE "gid" = 3;

NOTIFY data_changed, 'Your notification payload here'; 测试通过


http://www.niftyadmin.cn/n/5045468.html

相关文章

最新时间注入攻击和代码分析技术

点击星标&#xff0c;即时接收最新推文 本文选自《web安全攻防渗透测试实战指南&#xff08;第2版&#xff09;》 点击图片五折购书 时间注入攻击 时间注入攻击的测试地址在本书第2章。 访问该网址时&#xff0c;页面返回yes&#xff1b;在网址的后面加上一个单引号&#xff0c…

MacOS上的Pip和Python升级指南

在MacOS系统上&#xff0c;保持Pip和Python版本的最新状态对于顺利进行Python开发至关重要。通过升级Pip和Python&#xff0c;你可以享受到最新的功能、修复的bug以及提升的开发效率。本文将为你提供在MacOS上升级Pip和Python的详细指南&#xff0c;助你打造更强大的开发环境。…

黑马JVM总结(十九)

&#xff08;1&#xff09;GC调优1 通过官网查看查看JVM的参数&#xff1a; 可以使用java命令查看当前环境下的虚拟机参数&#xff1a; 学会使用一些工具如前面学的jmap &#xff0c;jconsole等等工具 &#xff08;2&#xff09;GC调优2 垃圾回收调优只是众多调优中的一个方…

R语言非线性方程数值分析生物降解、植物生长数据:多项式、渐近回归、米氏方程、逻辑曲线、Gompertz、Weibull曲线...

全文链接&#xff1a;https://tecdat.cn/?p33742 在选择最佳拟合实验数据的方程时&#xff0c;可能需要一些经验。当我们没有文献信息时该怎么办&#xff1f;我们建立模型的方法通常是经验主义的。也就是说&#xff0c;我们观察过程&#xff0c;绘制数据并注意到它们遵循一定的…

el-image 和 el-table冲突层级冲突问题

其中原理&#xff0c;很多博客已经所过了&#xff0c;table组件中使用图片&#xff0c;会出现层级过低问题&#xff0c; 网上大部分解决方式是 使用穿透 // 单元格样式 ::v-deep(.el-table__cell) {position: static !important; }我在此不推荐这种解决方式&#xff0c;原因&a…

Minio入门系列【7】Spring Boot集成Minio

1 前言 之前介绍了如何使用Minio提供的JAVA SDK进行上传和下载文件&#xff0c;在此基础上&#xff0c;我们可以使用spring boot集成Minio JAVA SDK&#xff0c;添加自动配置、装配、客户端管理等功能&#xff0c;简化开发 2 Spring Boot集成Minio 2.1 环境搭建 首先我们搭…

Python绘制二元函数图像

1 问题 利用python来解决绘制二元函数图像的问题。 2 方法 用文字描述解题思路&#xff0c;可配合一些图形以便更好的阐述。解决问题的步骤采用如下方式&#xff1a; 注意下述步骤全部使用(1)格式。 需要调用两个第三方库;Matplotlib、numpy编写代码绘制f(x,y)(sin(x)*sin(y))/…

离线部署 python 3.x 版本

文章目录 离线部署 python 3.x 版本1. 下载版本2. 上传到服务器3. 解压并安装4. 新建软连信息5. 注意事项 离线部署 python 3.x 版本 1. 下载版本 python 各版本下载地址 本次使用版本 Python-3.7.0a2.tgz # linux 可使用 wget 下载之后上传到所需服务器 wget https://www.py…