2 回答
TA贡献1943条经验 获得超7个赞
你快到了,只需用这个更新逻辑:
busControl.Start();
scheduler.JobFactory = new MassTransitJobFactory(busControl);
scheduler.Start().Wait();
Console.ReadKey();
busControl.Stop();
TA贡献1805条经验 获得超9个赞
所以你没有提到你是否有第三个消费者正在运行(在第三个控制台应用程序中)。为了调度使用 Quartz,您需要专门用于 Quartz 的第三个使用者。它必须正在运行,在这种情况下,石英接收端点将侦听“石英”队列。
[更新]
这是第三个控制台应用程序(石英服务)所需的配置示例:
var scheduler = CreateScheduler();
configurator.ReceiveEndpoint("quartz", e =>
{
configurator.UseMessageScheduler(e.InputAddress);
e.Consumer(() => new ScheduleMessageConsumer(scheduler));
e.Consumer(() => new CancelScheduledMessageConsumer(scheduler));
});
...
private static IScheduler CreateScheduler()
{
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
var scheduler = schedulerFactory.GetScheduler();
return scheduler;
}
并且您还需要为我们配置石英存储(如果您想在内存中进行测试,则为 SQLite、MSSql、RAM)。请在此处查看示例配置。
[/更新]
[更新2]
有人在群里发过类似的问题。幸运的是,他们提供了一个示例 github,其中包含一系列不同的 MT 功能,其中之一是单独的调度程序。请看一下,那里应该有你需要的一切。
[更新2]
如果您想在不运行完整的石英调度程序的情况下进行测试,那么您可以使用InMemory 调度程序。但这仅用于测试目的,您不应该在生产中使用它。
此外,在您的第一个代码片段中,您不需要获取调度程序的发送端点: var sendEndpoint = await busControl.GetSendEndpoint(new Uri("rabbitmq://localhost/quartz"));
因为,在总线配置中,rabbit.UseMessageScheduler(new Uri("rabbitmq://localhost/quartz"));表明无论何时您调用 ScheduleSend(从 ConsumeContext 或 IBus/IBusControl),它将始终使用该 /quartz 地址。
最后,这一行await sendEndpoint.ScheduleSend(new Uri("rabbitmq://localhost/publisher"),,您可以更改为 busControl.ScheduleSend(...)
- 2 回答
- 0 关注
- 155 浏览
添加回答
举报