Asp.net core 具有Redis持久性的MassTransit saga使方法Accpet没有实现异常
我正在尝试将Redis persistence添加到我的传奇中,这是一个管理对路由条的调用(以及根据路由条的结果向其他消费者发送额外消息)的传奇,希望它能解决我不断遇到的另一个超时问题 但是,我得到一条错误消息,该消息进入RabbitMQ中的saga_错误队列 消息中显示的错误为: 程序集“AutomatonymousGreenPipes.DynamicInternalC83411641FAD46798326D78FE6052C9,版本=0.0.0.0,区域性=中性,PublicKeyToken=null”中类型“GreenPipes.DynamicInternal.Automatonymous.State”中的方法“Accept”没有实现 我的相关配置代码是: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
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数据库,可以看到状态机实例每次都正确地进入
我还看到谷歌群组中有人也有同样的问题,但他们的帖子没有得到回复。这里的问题是请求-响应 它的工作原理如下:
UrlRequestId
repo.find(x=>x.UrlRequestId==message.Headers.RequestId)
查找您的实例(因此这不是真正的代码,而是实际发生的情况)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版本作为依赖项。