代码之家  ›  专栏  ›  技术社区  ›  YMC

NServiceBus 6中的早期消息调度出现问题。批处理消息调度不起作用?

  •  0
  • YMC  · 技术社区  · 6 年前

    public Task Handle(ICommand1 message, IMessageHandlerContext context)
    {
       using (var tx = _session.BeginTransaction(IsolationLevel.ReadCommitted))
       {    
           HandleMessage1(message1);
    
           _session.Flush();
           tx.Commit();
        }   
    }
    
    private void HandleMessage1(ICommand1 message1)
    {
        // Updating database
        ...
        // Sending other Command2 to separate handler
        bus.Send<ICommand2>(x =>
        {
           ...
        });
    }
    

    从日志中我可以看到,ICommand2比ICommand1处理程序更早开始处理,ICommand1处理程序负责提交数据库中的数据更改,在Command1处理程序更新之前获取“旧”数据。

    我的印象是,我们不会有这种问题,因为Nsb6为我们提供了 Batched message dispatch . 看来这不是我们的案子,我想知道为什么以及如何解决这个问题。我试着在MSMQ(没有发行版)下运行它。事务)和RabbitMq,结果相同。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Sean Feldman    6 年前

    context bus.Send() 你可能正在使用 IMessageSession IMessageHandlerContext ,相当于立即发送。

    public async Task Handle(ICommand1 message, IMessageHandlerContext context)
    {
       using (var tx = _session.BeginTransaction(IsolationLevel.ReadCommitted))
       {    
           await HandleMessage1(message1, context);
    
           _session.Flush();
           tx.Commit();
        }   
    }
    
    private async Task  HandleMessage1(ICommand1 message1, IMessageHandlerContext context)
    {
        // Updating database
        ...
        // Sending other Command2 to separate handler
        await context.Send<ICommand2>(x =>
        {
           ...
        });
    }
    
    
    推荐文章