我有一个运行QuartzNet Scheduler的aspnetcore Mvc网站。 调度程序具有侦听器,这些侦听器在执行作业和执行作业时触发。侦听器正在使用MediatR发布消息,然后由名为JobListenerEventsDispatcher的类处理该消息。
为了获得SignalR集线器,此类在构造函数中注入了IServiceProvider。
服务器端正在运行aspnetcore 2.2 QuartzScheduler和MediatR均为最新版本。
启动ConfigureServices中的代码,将MediatR服务添加到ServiceCollection:
services.AddMediatR(typeof(Startup).GetTypeInfo().Assembly);
QuartzNet JobListener中的发布MediatR消息的代码:
private async Task SendJobMessage(IJobExecutionContext model,CancellationToken cancellationToken)
{
try
{
await _service.Publish(new JobListenerEvent { JobContext = model }, cancellationToken);
}
catch (Exception)
{
// ignored
}
}
调度程序中的代码从JobListener接收消息:
public async Task Handle(JobListenerEvent notification, CancellationToken cancellationToken)
{
var context = _services.GetRequiredService<IHubContext<SchedulerHub>>();
await context.Clients.All.SendAsync("jobMessage", notification, cancellationToken);
}
到目前为止,它运行良好,并且Handle方法正在将消息发送给客户端。
JavaScript代码添加SignalR并订阅来自中心的消息:
// SignalR actions
var connection = new signalR.HubConnectionBuilder()
.withUrl('/scheduler-hub')
.configureLogging(signalR.LogLevel.None)
.build();
connection.on('jobMessage', function (model) {
logToConsole("jobMessage", model);
loadCurrentExecutingJobs();
});
已建立连接,但jobMessage处理程序未收到服务器端的任何内容。
其他任何人都可以做到吗?
答案 0 :(得分:0)
我找到了解决方法。 我的Joblistener与api控制器进行了交互。 控制器通过构造函数注入获得hubcontext,并发送消息。.