asp.net-core - 具有 Redis 持久性的 MassTransit saga 给出了 Method Accpet does not have an implementation exception

标签 asp.net-core redis masstransit automatonymous

我正在尝试将 Redis 持久性添加到我的 saga 中,它管理对路由单的调用(以及根据路由单的结果向其他消费者发送的附加消息),希望它能解决另一个超时问题我不断得到。

但是,我在 RabbitMQ 的 saga_error 队列中收到一条错误消息。

消息中显示的错误是:

Method 'Accept' in type 'GreenPipes.DynamicInternal.Automatonymous.State' from assembly 'AutomatonymousGreenPipes.DynamicInternalc83411641fad46798326d78fe60522c9, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation

我的相关配置代码是:

InstanceState(s => s.CurrentState);

Event(() => RequestLinkEvent, x => x.CorrelateById(context => context.Message.LinkId).SelectId(y => y.Message.LinkId));
Event(() => LinkCreatedEvent, x => x.CorrelateById(context => context.Message.LinkId));
Event(() => CreateLinkGroupFailedEvent, x => x.CorrelateById(context => context.Message.LinkId));
Event(() => CreateLinkFailedEvent, x => x.CorrelateById(context => context.Message.LinkId));
Event(() => RequestLinkFailedEvent, x => x.CorrelateById(context => context.Message.LinkId));

Request(() => LinkRequest, x => x.UrlRequestId, cfg =>
            {
                cfg.ServiceAddress = new Uri($"{hostAddress}/{nameof(SelectUrlByPublicId)}");
                cfg.SchedulingServiceAddress = new Uri($"{hostAddress}/{nameof(SelectUrlByPublicId)}");
                cfg.Timeout = TimeSpan.FromSeconds(30);
            });

上面代码中的LinkId始终是唯一的Guid。

当 saga 正在读回从我的路由 list 发送的事件(无论是成功还是失败事件)时,问题似乎发生了。

一个不工作的示例事件接口(interface)是:

public interface ILinkCreated
{
    Guid? CorrelationId { get; set; }
    int DatabaseId { get; set; }
    Guid LinkId { get; set; }
    string LinkName { get; set; }
}

如果我切换回 InMemorySagaRepository 一切正常(本地)。我尝试了很多不同的组合,现在却碰壁了。

我已经将所有软件包更新到最新版本。我也一直在检查我的 redis 数据库,可以看到状态机实例每次都正确进入。

我还看到 Google 群组中有人遇到了同样的问题,但他们的帖子没有得到回复。

最佳答案

这里的问题是请求-响应。

它是这样工作的:

  1. MT 将请求 id 放入 saga 状态属性 UrlRequestId
  2. 请求已发送
  3. 您会收到一个响应,响应在其 header 中包含请求者地址和请求 ID
  4. MT 使用 saga 存储库通过 repo.Find(x => x.UrlRequestId == message.Headers.RequestId)找到您的实例(因此这不是真正的代码,但这是发生了什么)
  5. Redis(或任何其他 KVS)不支持查询,因此我们也不支持 saga 存储库中的查询,您会得到“未实现”异常

您的响应相关规范无效,因为 Request 始终使用 header 来查找响应所属的 saga 实例。

您可以通过不使用请求-响应来解决此问题,而是使用 context.Publish(new LinkCreatedEvent { ... , CorrelationId = context.Message.CorrelationId }) 发出事件并使用通常的方法相关性。

关于asp.net-core - 具有 Redis 持久性的 MassTransit saga 给出了 Method Accpet does not have an implementation exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51741440/

相关文章:

c# - VS.NET 2017 强制在 ASP.NET 2.0 Core 应用程序中使用 StackExchange.Redis 1.2.4.0

.net-core - .Net Core RabbitMQ/Masstransit 同一应用程序中每个可配置线程数有一个消费者

c# - 如何在 C# 中使用 Automatonymous 实现状态机

c# - 无法访问已处置的对象。对象名称 : 'IServiceProvider' error in AspNet Core/EF Core project

c# - 如何对 ASP.Net Core 中特定对象中的特定字段进行授权?

c# - 如何将空合并运算符与 ActionResult ASP.NET Core 2.1 一起使用

cassandra - 如何对Key-Value存储中的两个数据集进行交集运算?

ruby-on-rails - Ohm & Redis : when to use set, 列表或集合?

windows - Windows 上 Redis 的日志文件

c# - 类库上的公共(public)交通连接管理