我正在尝试将 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 群组中有人遇到了同样的问题,但他们的帖子没有得到回复。
最佳答案
这里的问题是请求-响应。
它是这样工作的:
- MT 将请求 id 放入 saga 状态属性
UrlRequestId
- 请求已发送
- 您会收到一个响应,响应在其 header 中包含请求者地址和请求 ID
- MT 使用 saga 存储库通过
repo.Find(x => x.UrlRequestId == message.Headers.RequestId)
找到您的实例(因此这不是真正的代码,但这是发生了什么) - 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/