我正在尝试将Redis持久性添加到我的传奇中,该传奇正在管理对路由清单的调用(以及根据路由清单的结果向其他使用者发送其他消息),以期解决我不断遇到的另一个超时问题。
但是,我收到一条错误消息,该消息进入RabbitMQ中的saga_error队列。
消息中显示的错误是:
程序集’AutomatonymousGreenPipes.DynamicInternalc83411641fad46798326d78fe60522c9,Version = 0.0.0.0,Culture = neutral,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数据库,可以看到每次正确进入状态机实例。
我还看到Google网上论坛上的某个人也遇到了同样的问题,但是对他们的帖子没有任何回应。
因此,回答我自己的问题,也许会启发我自己的愚蠢。问题实际上是由我如何设置StateMachineInstance引起的。
而不是使用State类型的CurrentState,如下所示:
public State CurrentState {get; set;}
我应该将其指定为这样的字符串:
public string CurrentState { get; set;}
现在可以将其正确反序列化到对象中。我怀疑这也可能导致我的登台服务器上的InMemorySagaRepository超时问题。