MassTransit传奇与Redis的持久性提供了方法Accpet头没有实现异常(MassTran

2019-10-29 13:35发布

我想补充的Redis持久化到我的传奇这是管理调用传送名单(以及取决于路由名单的结果,其他消费者的其他消息)的希望,这将解决另一个超时问题我不断收到。

不过,我得到它出现在在RabbitMQ的我saga_error队列中的错误消息。

在该消息中所示的错误是:

方法汇编“接受”在类型“GreenPipes.DynamicInternal.Automatonymous.State“AutomatonymousGreenPipes.DynamicInternalc83411641fad46798326d78fe60522c9,版本= 0.0.0.0,文化=中立,公钥=空”不具有实施

我的相关配置代码为:

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);
            });

在上面的代码中的链路ID始终是唯一的GUID。

这个问题似乎在传奇被读回已经从我的路由发送滑的事件发生(无论是成功或失败的事件)。

不工作的一个例子事件接口是:

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

如果我切换回一个InMemorySagaRepository一切作品(局部)。 我试过的东西这么多不同的组合,现在已经撞南墙。

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

我还看到有人在谷歌集团有同样的问题,但有自己的后没有任何反应。

Answer 1:

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

它的工作原理是这样的:

  1. MT提出请求ID的传奇国家财产UrlRequestId
  2. 该请求被发送
  3. 你得到响应,响应包含在其标题中的请求地址和请求ID
  4. MT使用佐贺库找到使用您的实例repo.Find(x => x.UrlRequestId == message.Headers.RequestId)因此这不是真正的代码,但是这是发生了什么)
  5. Redis的(或任何其他KVS)不支持查询,所以我们不支持在佐贺库查询过,你会得到“未实现”异常

为响应您的相关规范有没有影响,因为Request总是使用头找到该响应属于传奇实例。

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



Answer 2:

因此,要回答我的问题,也许照我自己的愚蠢光。 这个问题,其实是被我怎么了我的设置造成StateMachineInstance。

相反,具有下述类型的国家CurrentState的:

public State CurrentState {get; set;}

我应该指定它作为一个字符串,例如:

public string CurrentState { get; set;}

现在,它可以在对象正确地反序列化。 我怀疑这可能是导致我与InMemorySagaRepository超时问题,我的临时服务器上了。



文章来源: MassTransit saga with Redis persistence gives Method Accpet does not have an implementation exception