为什么我在跳过的队列中收到消息

时间:2016-08-26 23:27:04

标签: masstransit

我在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应用程序中运行。

1 个答案:

答案 0 :(得分:2)

如果您在队列中收到的消息未被该接收端点上的消费者使用,则可能是您先前正在使用该消息类型并将其从消费者(或您的案例中为saga)中删除,或者你从其他目的使用队列,它消耗了这种消息类型。

无论哪种方式,如果你进入RabbitMQ管理控制台并查找队列,你可以展开Bindings chevron,点击进入同名交换(那是一个标准的MassTransit约定),然后扩展交换的绑定,以查看哪些消息类型(名为.NET类型名称的交换)绑定到该交换。

如果您看到端点未使用的那个,那就是罪魁祸首。您可以使用UI解除绑定,之后发布的消息将不再发送到队列。