在 ASP.Net 核心应用程序中向 MassTransit Saga 发送消息
Send message to MassTransit Saga in ASP.Net Core application
我在 Asp.Net 核心应用中有一个简单的 saga 配置:
services.AddSingleton<ISagaRepository<Request>, InMemorySagaRepository<Request>>();
services.AddMassTransit(x =>
{
x.AddSagaStateMachine<RequestStateMachine, Request>();
x.AddRequestClient<IRequestCreated>();
x.AddBus(provider => Bus.Factory.CreateUsingInMemory(cfg =>
{
cfg.UseInMemoryOutbox();
cfg.ConfigureEndpoints(provider);
}));
});
如果稍后我通过 IRequestClient<IRequestCreated>
向 Saga 发送消息:
var client = context.RequestServices.GetService<IRequestClient<IRequestCreated>>();
var response = await client.GetResponse<RequestCreatedResponse>(new
{
CorrelationId = Guid.NewGuid(),
ClientId = 1,
});
一切正常。但是如果我在 IBus
:
上尝试同样的事情
var mtbus = context.RequestServices.GetService<IBus>();
await mtbus.Send<IRequestCreated>(new
{
CorrelationId = Guid.NewGuid(),
ClientId = 1,
});
我收到错误 A convention for the message type Sample.AspNetCore.Host.Saga.IRequestCreated was not found
我错过了什么?
在你上面的例子中,因为没有为请求客户端指定服务地址,它正在发布请求。哪个路由到消费者。
在您失败的情况下,您使用的是 Send,它没有地址需要知道将消息发送到哪里。唯一的回退是未配置的约定。如果您想要相同的行为,老实说,既然您要发布 RequestCreated
事件,那么您也应该调用 Publish。
我在 Asp.Net 核心应用中有一个简单的 saga 配置:
services.AddSingleton<ISagaRepository<Request>, InMemorySagaRepository<Request>>();
services.AddMassTransit(x =>
{
x.AddSagaStateMachine<RequestStateMachine, Request>();
x.AddRequestClient<IRequestCreated>();
x.AddBus(provider => Bus.Factory.CreateUsingInMemory(cfg =>
{
cfg.UseInMemoryOutbox();
cfg.ConfigureEndpoints(provider);
}));
});
如果稍后我通过 IRequestClient<IRequestCreated>
向 Saga 发送消息:
var client = context.RequestServices.GetService<IRequestClient<IRequestCreated>>();
var response = await client.GetResponse<RequestCreatedResponse>(new
{
CorrelationId = Guid.NewGuid(),
ClientId = 1,
});
一切正常。但是如果我在 IBus
:
var mtbus = context.RequestServices.GetService<IBus>();
await mtbus.Send<IRequestCreated>(new
{
CorrelationId = Guid.NewGuid(),
ClientId = 1,
});
我收到错误 A convention for the message type Sample.AspNetCore.Host.Saga.IRequestCreated was not found
我错过了什么?
在你上面的例子中,因为没有为请求客户端指定服务地址,它正在发布请求。哪个路由到消费者。
在您失败的情况下,您使用的是 Send,它没有地址需要知道将消息发送到哪里。唯一的回退是未配置的约定。如果您想要相同的行为,老实说,既然您要发布 RequestCreated
事件,那么您也应该调用 Publish。