具有Redis持久性的MassTransit传奇赋予Method Accpet没有实现异常

时间:2018-08-08 07:58:00

标签: asp.net-core redis masstransit automatonymous

我正在尝试将Redis持久性添加到我的传奇中,该传奇正在管理对路由清单的调用(以及根据路由清单的结果向其他使用者发送其他消息),以希望它可以解决另一个超时问题我不断得到。

但是,我收到一条错误消息,该消息进入RabbitMQ中的saga_error队列。

消息中显示的错误是:

  

程序集'AutomatonymousGreenPipes.DynamicInternalc83411641fad46798326d78fe60522c9,版本= 0.0.0.0,文化=中性,PublicKeyToken = null'中的类型'GreenPipes.DynamicInternal.Automatonymous.State'中的方法'Accept'没有实现

我的相关配置代码为:

edt.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(YourActivity.this,"edt click", Toast.LENGTH_LONG).show();
    }
});

上面的代码中的LinkId始终是唯一的Guid。

当传奇故事回读了我的路由清单发送的事件(无论是成功还是失败事件)时,似乎就出现了问题。

不起作用的示例事件接口是:

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

如果我切换回InMemorySagaRepository,则一切正常(本地)。我尝试了许多不同的组合,现在碰到了墙。

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

我还看到Google网上论坛上的某个人遇到了同样的问题,但是对他们的帖子没有任何回应。

2 个答案:

答案 0 :(得分:0)

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

它是这样的:

  1. MT将请求ID放入传奇状态属性UrlRequestId
  2. 请求已发送
  3. 您会收到一个回复​​,该回复的标题中包含请求者地址和请求ID
  4. MT使用saga存储库通过repo.Find(x => x.UrlRequestId == message.Headers.RequestId) 查找您的实例(因此这不是真实的代码,但这会发生)
  5. Redis(或任何其他KVS)不支持查询,因此我们也不支持saga存储库中的查询,并且您会收到“未实现”异常

您的响应相关性规范无效,因为Request始终使用标头来查找响应所属的传奇实例。

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

答案 1 :(得分:0)

因此,回答我自己的问题,也许可以说明我自己的愚蠢。问题实际上是由我如何设置StateMachineInstance引起的。

而不是具有如下类型的State的CurrentState:

public State CurrentState {get; set;}

我应该将其指定为这样的字符串:

public string CurrentState { get; set;}

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