我在fork / join配置中有一个saga设置。
FileMetadataMsg
FileReadyMsg
SomeOtherMsg
SagaStart(correlationId)
FileSavedToMsg(correlationId, fileLoc)
FileMetadataMsg(correlationId, metadata)
FileReadyMsg(correlationId, fileLoc)
Consumer<FileSavedToMsg>
SomeOtherMsg(GotTheFileMsg.correlationId, data)
我在saga_skipped队列中获取了FileSavedToMsg。我只能假设它是由于在FileSavedToMsg上有一个correlationId,因为saga本身没有在其状态机中使用FileSavedToMsg而且没有Event<FileSavedToMsg>
。
如果这就是为什么......我应该在CorrelationId以外的字段中传递correlationId,那么传奇没有看到它?我需要它,所以我可以用它标记SomeOtherMsg。
以下是如何定义传奇终点
return Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri("rabbitmq://localhost/"), h =>
{
h.Username("guest");
h.Password("guest");
});
cfg.ReceiveEndpoint(host, "study_saga", epCfg =>
{
epCfg.StateMachineSaga(machine, repository);
});
});
以下是工作人员端点的定义方式
return Bus.Factory.CreateUsingRabbitMq(x =>
{
var host = x.Host(new Uri("rabbitmq://localhost/"), h =>
{
h.Username("guest");
h.Password("guest");
});
x.ReceiveEndpoint(host, "study_3d_volume_worker", c =>
{
c.PrefetchCount = 1;
c.Instance(_studyCreatedMsgConsumer);
});
});
它们在同一台计算机上运行,但在单独的Console / Topshelf应用程序中运行。
答案 0 :(得分:2)
如果您在队列中收到的消息未被该接收端点上的消费者使用,则可能是您先前正在使用该消息类型并将其从消费者(或您的案例中为saga)中删除,或者你从其他目的使用队列,它消耗了这种消息类型。
无论哪种方式,如果你进入RabbitMQ管理控制台并查找队列,你可以展开Bindings chevron,点击进入同名交换(那是一个标准的MassTransit约定),然后扩展交换的绑定,以查看哪些消息类型(名为.NET类型名称的交换)绑定到该交换。
如果您看到端点未使用的那个,那就是罪魁祸首。您可以使用UI解除绑定,之后发布的消息将不再发送到队列。