MassTransit Saga 重新交付
Masstransit Saga redelivery
我想使用独立的 quartz 调度程序为状态机 saga 设置消息调度重新传送。现在它适用于普通消费者,但我无法正确设置 saga 的重新交付。我的传奇配置如下所示:
MassTransit.Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var retryPolicy = Retry.Incremental(5, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(2));
cfg.UseMessageScheduler(new Uri($"rabbitmq://localhost/SchedulerQueue"));
var host = cfg.Host(new Uri(uri), h =>
{
h.Username(config.RabbitMqUser);
h.Password(config.RabbitMqPassword);
});
cfg.ReceiveEndpoint(host, "SagaQueue", e =>
{
e.Durable = true;
e.StateMachineSaga(new MySaga(),
repository, c =>
{
c.UseTransaction();
c.Message<ISagaEvent>(y => y.UseScheduledRedelivery(retryPolicy));
});
});
});
其中 ISagaEvent 是由 saga 处理的消息。我是不是做错了什么,有没有办法为 saga 配置预定的重新交付?
要在 saga 中进行调度,通常最好使用实际的状态机调度功能,这样 saga 的状态就会更新以指示重新交付。
本质上,如果您在尚未准备好状态下收到事件,请使用 Schedule()
将消息安排在未来某个时间,此时 saga 可能处于它可能处于的状态可以处理。
文档中有一个很好的时间表示例:
http://masstransit-project.com/MassTransit/advanced/sagas/automatonymous.html
我想使用独立的 quartz 调度程序为状态机 saga 设置消息调度重新传送。现在它适用于普通消费者,但我无法正确设置 saga 的重新交付。我的传奇配置如下所示:
MassTransit.Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var retryPolicy = Retry.Incremental(5, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(2));
cfg.UseMessageScheduler(new Uri($"rabbitmq://localhost/SchedulerQueue"));
var host = cfg.Host(new Uri(uri), h =>
{
h.Username(config.RabbitMqUser);
h.Password(config.RabbitMqPassword);
});
cfg.ReceiveEndpoint(host, "SagaQueue", e =>
{
e.Durable = true;
e.StateMachineSaga(new MySaga(),
repository, c =>
{
c.UseTransaction();
c.Message<ISagaEvent>(y => y.UseScheduledRedelivery(retryPolicy));
});
});
});
其中 ISagaEvent 是由 saga 处理的消息。我是不是做错了什么,有没有办法为 saga 配置预定的重新交付?
要在 saga 中进行调度,通常最好使用实际的状态机调度功能,这样 saga 的状态就会更新以指示重新交付。
本质上,如果您在尚未准备好状态下收到事件,请使用 Schedule()
将消息安排在未来某个时间,此时 saga 可能处于它可能处于的状态可以处理。
文档中有一个很好的时间表示例: http://masstransit-project.com/MassTransit/advanced/sagas/automatonymous.html