- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 SignalR 开发实时数据网格。我有一个 SignalR 集线器。
GetStocks
向服务器发送消息。GetStockTickerStream
溪流。该流仅用于更新。现在我想用实际数据替换随机生成的股票行情数据,并且当在数据库中插入/更新/删除项目时,将该更新推送到 SignalR GetStockTickerStream
.
回顾一下,有没有办法在 Azure SQL 数据库上放置触发器,以便在数据库中插入/更新/删除项目时触发 Azure 函数?
关于如何做到这一点的一个很好的解释和一个小片段会很棒。
public sealed class StockTickerHub : Hub
{
private readonly IStockTickerService _stockTickerService;
public StockTickerHub(IStockTickerService stockTickerService)
{
_stockTickerService = stockTickerService;
}
public ChannelReader<Stock> GetStockTickerStream(CancellationToken cancellationToken)
{
var channel = Channel.CreateUnbounded<Stock>();
_ = _stockTickerService.SubscribeAsync(channel.Writer, cancellationToken);
return channel.Reader;
}
public async Task GetStocks()
{
var stocks = await _stockTickerService.GetStocksAsync();
await Clients.Caller.SendAsync("ReceiveStocks", stocks);
}
}
public class Stock
{
public required long Id { get; init; }
public required string Symbol { get; init; }
public required double Price { get; init; }
}
public interface IStockTickerService
{
Task<IEnumerable<Stock>> GetStocksAsync();
Task SubscribeAsync(ChannelWriter<Stock> writer, CancellationToken cancellationToken);
}
public sealed class StockTickerService : IStockTickerService
{
private static readonly string[] Stocks =
{
"TESLA", "S&P 500", "DAX", "NASDAQ", "DOW"
};
public Task<IEnumerable<Stock>> GetStocksAsync()
{
return Task.FromResult(Enumerable.Range(1, 10).Select(index => new Stock
{
Id = index,
Symbol = Stocks[Random.Shared.Next(Stocks.Length)],
Price = Math.Round(Random.Shared.NextDouble() * 100, 2)
}));
}
public async Task SubscribeAsync(ChannelWriter<Stock> writer, CancellationToken cancellationToken)
{
try
{
while (true)
{
var stock = new Stock
{
Id = 1,
Symbol = "TESLA",
Price = Math.Round(Random.Shared.NextDouble() * 100, 2)
};
await writer.WriteAsync(stock, cancellationToken);
await Task.Delay(1000, cancellationToken);
}
}
finally
{
writer.Complete();
}
}
}
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddDataGrid(this IServiceCollection services)
{
ArgumentNullException.ThrowIfNull(services);
services.AddSingleton<IStockTickerService, StockTickerService>();
return services;
}
public static IEndpointRouteBuilder UseDataGrid(this IEndpointRouteBuilder app)
{
ArgumentNullException.ThrowIfNull(app);
app.MapHub<StockTickerHub>("/stockticker");
return app;
}
}
import { useEffect } from "react";
import { useDispatch, useSelector } from "react-redux";
import { Table } from "antd";
import { HubConnectionState } from "redux-signalr";
import hubConnection from "../store/middlewares/signalr/signalrSlice";
import { Stock, addStock } from "../store/reducers/stockSlice";
import { RootState } from "../store";
import "./DataGrid.css";
const DataGrid = () => {
const dispatch = useDispatch();
const stocks = useSelector((state: RootState) => state.stock.stocks);
useEffect(() => {
if (hubConnection.state !== HubConnectionState.Connected) {
hubConnection
.start()
.then(() => {
console.log("Started connection via SignalR");
hubConnection.send("GetStocks");
hubConnection.stream("GetStockTickerStream").subscribe({
next: async (item: Stock) => {
console.log(item);
dispatch(addStock(item)); // Dispatch addStock action to update Redux store
},
complete: () => {
console.log("Completed");
},
error: (err) => {
console.error(err);
},
});
})
.catch((err) => console.error(`Faulted: ${err.toString()}`));
}
// return () => {
// hubConnection
// .stop()
// .then(() => {})
// .catch((err) => console.error(err.toString()));
// };
}, [dispatch]);
return (
<Table dataSource={stocks} rowKey={(record) => record.id}>
<Table.Column title="ID" dataIndex="id" key="id" />
<Table.Column title="Symbol" dataIndex="symbol" key="symbol" />
<Table.Column title="Price" dataIndex="price" key="price" />
</Table>
);
};
export default DataGrid;
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
export type Stock = Readonly<{
id: number;
symbol: string;
price: number;
}>;
export type StockState = Readonly<{
stocks: Stock[];
}>;
const initialState: StockState = {
stocks: [],
};
const stockSlice = createSlice({
name: "stock",
initialState: initialState,
reducers: {
getStocks: (state, action: PayloadAction<Stock[]>) => {
state.stocks = [...state.stocks, ...action.payload];
},
addStock: (state, action: PayloadAction<Stock>) => {
const stockIndex = state.stocks.findIndex(
(stock) => stock.id === action.payload.id
);
if (stockIndex !== -1) {
// If the stock already exists, update its price
state.stocks[stockIndex].price = action.payload.price;
} else {
// If the stock doesn't exist, add it to the array
state.stocks.push(action.payload);
}
},
},
});
export const { getStocks, addStock } = stockSlice.actions;
export default stockSlice.reducer;
最佳答案
经过测试,我发现azure sql数据库不支持SqlDependency OnChange事件。如果你想了解更多关于SqlDependency的信息,可以查看this thread .
但我找到了 Azure SQL 触发器。 Azure SQL 触发器绑定(bind)使用轮询循环来检查更改,在检测到更改时触发用户函数。
关于c# - 在 Azure SQL 数据库中插入/更新/删除新记录时将更新推送到 SignalR 流中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75654022/
我查看了网站上的一些问题,但还没有完全弄清楚我做错了什么。我有一些这样的代码: var mongoose = require('mongoose'), db = mongoose.connect('m
基本上,根据 this bl.ocks,我试图在开始新序列之前让所有 block 都变为 0。我认为我需要的是以下顺序: 更新为0 退出到0 更新随机数 输入新号码 我尝试通过添加以下代码块来遵循上述
我试图通过使用随机数在循环中设置 JSlider 位置来模拟“赛马”的投注结果。我的问题是,当然,我无法在线程执行时更新 GUI,因此我的 JSlider 似乎没有在竞赛,它们从头到尾都在运行。我尝试
该功能非常简单: 变量:$table是正在更新的表$fields 是表中的字段,$values 从帖子生成并放入 $values 数组中而$where是表的索引字段的id值$indxfldnm 是索引
让我们想象一个环境:有一个数据库客户端和一个数据库服务器。数据库客户端可以是 Java 程序或其他程序等;数据库服务器可以是mysql、oracle等。 需求是在数据库服务器上的一个表中插入大量记录。
在我当前的应用程序中,我正在制作一个菜单结构,它可以递归地创建自己的子菜单。然而,由于这个原因,我发现很难也允许某种重新排序方法。大多数应用程序可能只是通过“排序”列进行排序,但是在这种情况下,尽管这
Provisioning Profile 有 key , key 链依赖于它。我想知道 key 什么时候会改变。 Key will change after renew Provisioning Pr
截至目前,我在\server\publications.js 中有我的 MongoDB“选择”,例如: Meteor.publish("jobLocations", function () { r
我读到 UI 应该始终在主线程上更新。但是,当谈到实现这些更新的首选方法时,我有点困惑。 我有各种函数可以执行一些条件检查,然后使用结果来确定如何更新 UI。我的问题是整个函数应该在主线程上运行吗?应
我在代理后面,我无法构建 Docker 镜像。 我试过 FROM ubuntu , FROM centos和 FROM alpine ,但是 apt-get update/yum update/apk
我构建了一个 Java 应用程序,它向外部授权客户端公开网络服务。 Web 服务使用带有证书身份验证的 WS-security。基本上我们充当自定义证书颁发机构 - 我们在我们的服务器上维护一个 ja
因此,我有时会在上传新版本时使用 app_offline.htm 使应用程序离线。 但是,当我上传较大的 dll 时,我收到黄色错误屏幕,指出无法加载 dll。 这似乎与我对 app_offline.
我刚刚下载了 VS Apache Cordova Tools Update 5,但遇到了 Node 和 NPM 的问题。我使用默认的空白 cordova 项目进行测试。 版本 如果我在 VS 项目中对
所以我有一个使用传单库实例化的 map 对象。 map 实例在单独的模板中创建并以这种方式路由:- var app = angular.module('myApp', ['ui', 'ngResour
我使用较早的 Java 6 u 3 获得的帧速率是新版本的两倍。很奇怪。谁能解释一下? 在 Core 2 Duo 1.83ghz 上,集成视频(仅使用一个内核)- 1500(较旧的 java)与 70
我正在使用 angular 1.2 ng-repeat 创建的 div 也包含 ng-click 点击时 ng-click 更新 $scope $scope 中的变化反射(reflect)在使用 $a
这些方法有什么区别 public final void moveCamera(CameraUpdate更新)和public final void animateCamera (CameraUpdate
我尝试了另一篇文章中某人评论中关于如何将树更改为列表的建议。但是,我在某处(或某物)有未声明的变量,所以我列表中的值是 [_G667, _G673, _G679],而不是 [5, 2, 6],这是正确
实现以下场景的最佳方法是什么? 我需要从java应用程序调用/查询包含数百万条记录的数据库表。然后,对于表中的每条记录,我的应用程序应该调用第三方 API 并获取状态字段作为响应。然后我的应用程序应该
只是在编写一些与 java 图形相关的代码,这是我今天的讲座中的非常简单的示例。不管怎样,互联网似乎说更新不会被系统触发器调用,例如调整框架大小等。在这个例子中,更新是由这样的触发器调用的(因此当我只
我是一名优秀的程序员,十分优秀!