在公共交通中预定发布
Scheduled Publish in Mass Transit
我将 Mass Transit 与 .NET Core 3.1 和 Azure 服务总线结合使用。
我想在向主题发布消息时使用服务总线的预定传递功能。 AZSB 似乎很好地支持这一点,但我在尝试让 MT 做到这一点时遇到了问题。
我之前已成功将计划的消息发送到队列,但想改用 pub/sub。这是初始发送,因此不在消费者上下文中。
我现在已经达到 'schedule published' 一条消息的地步,它在消息上具有正确的 ScheduledTime 属性,并且消息类型是“urn:message:MassTransit.Scheduling:ScheduledMessage” .
但是,消息直接进入订阅以立即传递,而不是在主题内安排。
这是我的代码:
private async Task<Result> PublishScheduledMessage(MyTask message, DateTime scheduledDelivery)
{
try
{
var endpoint = await _bus.GetPublishSendEndpoint<MyTask>();
await _bus.SchedulePublish<ScheduledMessage>(endpoint, scheduledDelivery, message);
return Result.Success();
}
catch (MassTransitException e)
{
_logger.Error(e, $"Error while trying to send scheduled MyTask. Exception: {e.Message}");
return Result.Failure(e.Message);
}
}
(我也试过发布 MyTask 类型而不是 ScheduledMessage,但没有区别)
我能找到的唯一文档是 here。但是scheduler接口没有Publish接口,只有send,所以看起来只会投递到queues? SchedulePublish 是否仅适用于 Rabbit 和 Quartz?
有人可以帮忙吗?
首先,MassTransit v7 在 IMessageScheduler
中内置了 SchedulePublish
,因此您可以在升级后使用它。
同时,由于您使用的是 Azure 服务总线,您只需在发布时设置 ScheduledEnqueueTime
即可轻松安排发布,如下所示(使用扩展方法)。
bus.Publish<MyTask>(message, context =>
context.SetScheduledEnqueueTime(delay));
这将为您设置 属性,这会将消息延迟到预定时间。基本上,调度程序正在做同样的事情。
当您使用 Azure 服务总线(而不是使用 Quartz 或 Hangfire)计划消息时,您根本不使用 ScheduleMessage 类型,它们仅用于外部消息计划程序。
我将 Mass Transit 与 .NET Core 3.1 和 Azure 服务总线结合使用。
我想在向主题发布消息时使用服务总线的预定传递功能。 AZSB 似乎很好地支持这一点,但我在尝试让 MT 做到这一点时遇到了问题。
我之前已成功将计划的消息发送到队列,但想改用 pub/sub。这是初始发送,因此不在消费者上下文中。
我现在已经达到 'schedule published' 一条消息的地步,它在消息上具有正确的 ScheduledTime 属性,并且消息类型是“urn:message:MassTransit.Scheduling:ScheduledMessage” .
但是,消息直接进入订阅以立即传递,而不是在主题内安排。
这是我的代码:
private async Task<Result> PublishScheduledMessage(MyTask message, DateTime scheduledDelivery)
{
try
{
var endpoint = await _bus.GetPublishSendEndpoint<MyTask>();
await _bus.SchedulePublish<ScheduledMessage>(endpoint, scheduledDelivery, message);
return Result.Success();
}
catch (MassTransitException e)
{
_logger.Error(e, $"Error while trying to send scheduled MyTask. Exception: {e.Message}");
return Result.Failure(e.Message);
}
}
(我也试过发布 MyTask 类型而不是 ScheduledMessage,但没有区别)
我能找到的唯一文档是 here。但是scheduler接口没有Publish接口,只有send,所以看起来只会投递到queues? SchedulePublish 是否仅适用于 Rabbit 和 Quartz?
有人可以帮忙吗?
首先,MassTransit v7 在 IMessageScheduler
中内置了 SchedulePublish
,因此您可以在升级后使用它。
同时,由于您使用的是 Azure 服务总线,您只需在发布时设置 ScheduledEnqueueTime
即可轻松安排发布,如下所示(使用扩展方法)。
bus.Publish<MyTask>(message, context =>
context.SetScheduledEnqueueTime(delay));
这将为您设置 属性,这会将消息延迟到预定时间。基本上,调度程序正在做同样的事情。
当您使用 Azure 服务总线(而不是使用 Quartz 或 Hangfire)计划消息时,您根本不使用 ScheduleMessage 类型,它们仅用于外部消息计划程序。