Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 具有Redis持久性的MassTransit saga使方法Accpet没有实现异常_Asp.net Core_Redis_Masstransit_Automatonymous - Fatal编程技术网

Asp.net core 具有Redis持久性的MassTransit saga使方法Accpet没有实现异常

Asp.net core 具有Redis持久性的MassTransit saga使方法Accpet没有实现异常,asp.net-core,redis,masstransit,automatonymous,Asp.net Core,Redis,Masstransit,Automatonymous,我正在尝试将Redis persistence添加到我的传奇中,这是一个管理对路由条的调用(以及根据路由条的结果向其他消费者发送额外消息)的传奇,希望它能解决我不断遇到的另一个超时问题 但是,我得到一条错误消息,该消息进入RabbitMQ中的saga_错误队列 消息中显示的错误为: 程序集“AutomatonymousGreenPipes.DynamicInternalC83411641FAD46798326D78FE6052C9,版本=0.0.0.0,区域性=中性,PublicKeyToken

我正在尝试将Redis persistence添加到我的传奇中,这是一个管理对路由条的调用(以及根据路由条的结果向其他消费者发送额外消息)的传奇,希望它能解决我不断遇到的另一个超时问题

但是,我得到一条错误消息,该消息进入RabbitMQ中的saga_错误队列

消息中显示的错误为:

程序集“AutomatonymousGreenPipes.DynamicInternalC83411641FAD46798326D78FE6052C9,版本=0.0.0.0,区域性=中性,PublicKeyToken=null”中类型“GreenPipes.DynamicInternal.Automatonymous.State”中的方法“Accept”没有实现

我的相关配置代码是:

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

这个问题似乎发生在传奇故事读回从我的路由单发送的事件时(无论是成功还是失败事件)

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

public interface ILinkCreated
{
    Guid? CorrelationId { get; set; }
    int DatabaseId { get; set; }
    Guid LinkId { get; set; }
    string LinkName { get; set; }
}
如果我切换回InMemorySagaRepository,一切都可以(本地)工作。我尝试了很多不同的组合,现在遇到了困难

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


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

这里的问题是请求-响应

它的工作原理如下:

  • MT将请求id放入saga状态属性
    UrlRequestId
  • 请求已发送
  • 当您得到一个响应时,响应在其头中包含请求者地址和请求id
  • MT使用saga存储库通过
    repo.find(x=>x.UrlRequestId==message.Headers.RequestId)
    查找您的实例(因此这不是真正的代码,而是实际发生的情况)
  • Redis(或任何其他KVS)不支持查询,所以我们也不支持saga存储库中的查询,您会遇到“未实现”异常
  • 您对响应的相关规范无效,因为
    Request
    始终使用头来查找响应所属的saga实例


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

    来回答我自己的问题,也许可以为我自己的愚蠢亮起一点灯。这个问题实际上是由我如何设置StateMachineInstance引起的

    而不是将CurrentState设置为以下类型的状态:

    public State CurrentState {get; set;}
    
    我应该将其指定为字符串,如下所示:

    public string CurrentState { get; set;}
    

    现在可以将其反序列化到对象中。我怀疑这可能也导致了我在登台服务器上的InMemorySagaRepository出现超时问题。

    发布相关配置代码。我已经更新了事件的postPost代码,我猜它是一个带有方法的接口,不支持方法,不应添加到消息协定中。你的接受可能就是那个方法。我已经更新了我的帖子。正如您所看到的,它是一个非常简单的接口,没有任何方法(实现类也是相同的)。我最初认为是我的接口导致了这一点,并尝试了一些不同的配置,但没有运气。如果您认为这可能是MT中的一个bug,我可能会尝试将所有内容连接起来并通过它进行调试(我希望能够以某种方式为MT提供帮助,因为你们非常乐于助人,我喜欢它的工作方式)。我一直在通过MassTransit.Redisfication进行调试,并发现了更多信息。TypedDatabase.cs中的反序列化(字符串json)方法是发生错误的地方。如果您将T更改为我的实际类(我复制了它以进行检查),然后进行反序列化,则不会发生错误。我认为T是一个GreenPipes.DynamicInternal.Automatonymous.State类型,我认为它是在GreenPipes DynamicImplementationBuilder.cs类中通过编程创建的。我猜这会增加Accpet方法,但我不太了解如何修复它。不幸的是,这并没有解决它。我已经删除了请求-响应,同样的问题也发生了。错误发生在saga试图读取路由单发布的事件时,我相信。嗯,我不知道路由单,问题中没有提到。您安装了什么版本的MT和GreenPipes?抱歉,这是原始问题,但更多的是作为旁注。我已经更新了这个问题,让它更清楚。我使用的是MT的5.1.4版本,其中安装了GreenPipes的2.1.1版本作为依赖项。