使用反应式扩展进行数据库轮询

2023-11-24

我必须及时查询数据库以了解遗留系统的状态。我想过将查询包装在Observable,但我不知道正确的方法。

基本上,每 5 秒就会出现相同的查询。但我担心我将不得不面对这些问题:

  • 如果查询执行需要 10 秒怎么办?我不想 如果前一个查询仍在处理中,则执行任何新查询。
  • 另外,应该有一个超时时间。如果当前查询没有执行 例如,20 秒后,应显示一条信息性消息 记录并应发送新的尝试(相同的查询)。

额外细节:

  • 查询只是一个SELECT返回带有状态代码列表的数据集(working, faulted).
  • Observable 序列将始终获取从查询接收到的最新数据,类似于 Switch 扩展方法。
  • 我想将数据库查询(冗长的操作)包装到一个任务中,但我不确定这是否是最佳选择。

我几乎确定查询应该在另一个线程中执行,但我不知道可观察的应该是什么样子,曾经读过Lee Campbell 的 Rx 简介.


这是使用 Rx 轮询另一个系统的相当经典的案例。大多数人都会用Observable.Interval作为他们的首选运营商,对于大多数人来说这没什么问题。

但是,您对超时和重试有特定要求。在这种情况下,我认为你最好使用运算符组合:

  • Observable.Timer允许您在指定时间执行查询
  • Timeout识别已溢出的数据库查询
  • ToObservable()映射你的Task结果为可观察的序列。
  • Retry让您在超时后恢复
  • Repeat允许您在成功的数据库查询后继续。这也将保持上一个数据库查询完成与下一个数据库查询开始之间的初始周期/间隙。

这个工作LINQPad代码片段应该显示查询正常工作:

void Main()
{
    var pollingPeriod = TimeSpan.FromSeconds(5);
    var dbQueryTimeout = TimeSpan.FromSeconds(10);

    //You will want to have your Rx query timeout after the expected silence of the timer, and then further maximum silence.
    var rxQueryTimeOut = pollingPeriod + dbQueryTimeout;

    var scheduler = new EventLoopScheduler(ts => new Thread(ts) { Name = "DatabasePoller" });

    var query = Observable.Timer(pollingPeriod, scheduler)
                    .SelectMany(_ => DatabaseQuery().ToObservable())
                    .Timeout(rxQueryTimeOut, Observable.Return("Timeout"), scheduler)
                    .Retry()    //Loop on errors
                    .Repeat();  //Loop on success

    query.StartWith("Seed")
        .TimeInterval(scheduler)    //Just to debug, print the timing gaps.
        .Dump();
}

// Define other methods and classes here
private static int delay = 9;
private static int delayModifier = 1;
public async Task<string> DatabaseQuery()
{
    //Oscillate the delay between 3 and 12 seconds
    delay += delayModifier;
    var timespan = TimeSpan.FromSeconds(delay);
    if (delay < 4 || delay > 11)
        delayModifier *= -1;
    timespan.Dump("delay");
    await Task.Delay(timespan);
    return "Value";
}

结果如下:

Seed 00:00:00.0125407
Timeout 00:00:15.0166379
Timeout 00:00:15.0124480
Timeout 00:00:15.0004520
Timeout 00:00:15.0013296
Timeout 00:00:15.0140864
Value 00:00:14.0251731
Value 00:00:13.0231958
Value 00:00:12.0162236
Value 00:00:11.0138606

样本的关键部分是......

var query = Observable.Timer(TimeSpan.FromSeconds(5), scheduler)
                .SelectMany(_ => DatabaseQuery().ToObservable())
                .Timeout(rxQueryTimeOut, Observable.Return("Timeout"), scheduler)
                .Retry()    //Loop on errors
                .Repeat();  //Loop on success

EDIT:以下是如何得出此解决方案的进一步说明。https://github.com/LeeCampbell/RxCookbook/blob/master/Repository/Polling.md

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用反应式扩展进行数据库轮询 的相关文章

  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 从 Excel 应用程序对象中查找位数(32 位/64 位)?

    是否可以从 Microsoft Office Interop Excel ApplicationClass 确定 Excel 是以 32 位还是 64 位运行 Edit该解决方案应该适用于 Excel 2010 和 Excel 2007 此
  • 非闪亮上下文中的反应式对象绑定

    实际问题 你怎样才能近似反应性环境 行为 http shiny rstudio com tutorial lesson6 建立者shiny http shiny rstudio com函数 或者甚至可能在一个函数中使用这些函数无光泽上下文以

随机推荐

  • 使用 Electron 嵌入 Mongodb

    我将 MongoDB 源代码保存在电子源代码中 并使用以下命令运行 MongoDB const app require electron app const child process require child process const
  • Rails:使用回形针防止重复照片上传?

    如果用户尝试使用 Paperclip 将同一张照片上传到 Rails 应用程序两次 是否会引发验证错误 Paperclip 似乎没有提供此功能 我正在使用 Rails 2 3 5 和回形针 明显地 解决方案 或至少其中之一 根据 Beerl
  • 创建一个只有一个对角线的 UIView

    我需要创建一个左边框倾斜的 UIView45度我想知道 有没有办法以编程方式实现这一目标 做CA变换3D在这种情况下帮助我 因为它不是真正的 3D 旋转 Edit 这是一张图片 更多地解释了我所需的输出 如果您只想要没有内容的形状 那么您可
  • gmpxx.h:没有这样的文件或目录

    我刚刚安装了一个全新的 mingw 32 位 下载它来自官方项目页面来自 Sourceforge 我安装了包中的所有内容 所有编译器等等 然后我从下载hereMinGW 的 gmp 我将 gmp 5 0 1 1 mingw32 src ta
  • 显示用户窗体后将焦点设置回应用程序窗口

    当显示用户表单时 运行其Show方法 它不仅显示在屏幕上 而且还获取焦点 例如击键的目的地 比如说 用户窗体是一个定制的工具栏 它是Show开火Workbook Open 但表单本身的使用相对较少 因此我们希望焦点在其出现后立即返回到主应用
  • WPF 元素事件处理程序中的 UI 更新

    WPF 中的 UI 更新存在问题 我有这样的代码 private void ButtonClick EventHandler object sender RoutedEventArgs e Label Visibility Visibili
  • Grails / Groovy - 域对象 - 其属性映射

    如何获取我的域对象之一上仅用户定义属性的键 值的映射 问题是 如果我自己这样做 我会得到我的属性加上类 元类 约束 闭包等 我认为 Grails 可以相当容易地做到这一点 因为它是在脚手架代码中的某个级别完成的 对吗 我自己怎样才能做到这一
  • 循环 PHP 嵌套数组 - 将值提取到刀片视图中 (Laravel)

    我知道关于这个主题有很多问题 但没有一个完全解决这个问题 据我所知 我在 Laravel 项目中有一个 PHP 数组 仅供参考 是通过 Guzzle 响应返回的 PHP 数组 users array 2 error gt bool fals
  • ApplicationException 或创建自定义异常?

    在我的文件存储库中 当InsertFile 方法称为 当上传文件大小超过限制时 当超出存储容量时 目前我只是抛出一个ApplicationException与相关消息 public void InsertFile HttpPostedFil
  • 尽管已设置操作,但单击分段时仍显示 NSSegmentedControl 菜单

    我的 UI 上有一个带有 4 个按钮的 NSSegmentedControl 该控件连接到一个方法 该方法将根据单击的段调用不同的方法 IBAction performActionFromClick id sender NSInteger
  • 使用 AsyncTask 下载文件

    我正在尝试使用 asyncTask 下载文件 但无法正常工作 没有错误消息或什么也没有 只是不要下载文件 我尝试了所有方法 但似乎暂时没有输入 任何人都知道可以做什么是问题所在吗 我在手机上测试过 网址也可以 class DownloadF
  • 在 Matlab 中禁用绘图

    我有一些用 Matlab 编写的程序 由于某些原因我需要运行几次 调试 使用不同的输入进行测试等 但是 程序及其各种功能绘制了很多图表 因此每次运行程序时 我都必须等待所有图表显示出来 这是非常烦人且耗时的 尤其是当您使用小型笔记本电脑 程
  • ag-grid 在单元格渲染器之上渲染

    我已经尝试了我所知道的一切 让我的自定义下拉单元格渲染器显示为 agGrid 示例中最上面的 div 我玩过 z index 定位等 但没有运气 唯一做的事情就是转到其中一个有问题的行并取消选择该行的转换 但随后该行就消失了 欢迎任何想法
  • SVG 九切片缩放

    怎样才能获得九片缩放在 SVG 中 具体来说 我正在寻找一种方法来定义 SVG 对象 使其在调整大小时表现得像九切片对象 某些元素保持其尺寸 而其他元素随容器缩放 如果您打算将其应用于 svg 那么CSS3 边框和背景如果您引用 svg s
  • C# - 将文本文件加载为类

    有没有办法将 txt 文件作为类加载 然后我的主程序可以从中调用函数 我基本上试图向我的简单应用程序添加 mod 支持 用户可以从每个文件中选择选项 该文件遵循类似 但不相同 的格式 带有一堆在主程序中调用的空位 函数 我怎样才能做到这一点
  • Keras 用于多任务学习神经网络的顺序 API 与函数式 API

    我想为多任务深度学习任务设计一个神经网络 在 Keras API 中 我们可以使用 顺序 或 函数 方法来构建这样的神经网络 下面我提供了用于构建网络的代码 使用两种方法构建具有两个输出的网络 顺序 seq model Sequential
  • Android任务和进程、SingleTask和SingleInstance

    我已经阅读了 Google Android 开发者页面 但是任务的概念 http developer android com guide components tasks and back stack html 真让我困惑 当我读到 Sin
  • 如何使用 javascript 在 html 中截取屏幕截图?

    我是 html 和 javascript 的新手 我正在尝试截取我的 html 页面的屏幕截图并将其另存为jpg or png file Here is my html image 我想通过拖放来截取右侧的屏幕截图 灰色 divs按图像右上
  • CoreData:错误:(14) 数据库 I/O 错误

    在 XCode 中编译并运行项目时使用Core Data我收到一个以前从未见过的错误 2013 09 12 16 59 10 156 myapp 57811 70b CoreData error 14 I O error for datab
  • 使用反应式扩展进行数据库轮询

    我必须及时查询数据库以了解遗留系统的状态 我想过将查询包装在Observable 但我不知道正确的方法 基本上 每 5 秒就会出现相同的查询 但我担心我将不得不面对这些问题 如果查询执行需要 10 秒怎么办 我不想 如果前一个查询仍在处理中