使用redis集成的Masstransit saga导致异常

时间:2018-01-23 08:09:27

标签: redis masstransit

我想在我的应用程序中使用RedisSagaRepository来使用MassTransit传奇。 初始化看起来像

        var machine = new CreditTransactionStateMachine();
        var redisOptions = new ConfigurationOptions
        {
            EndPoints =
            {
                "link-to-redis:6379",
            },
            ClientName = "login",
            Password = "pass",

        };

        var redis = ConnectionMultiplexer.Connect(redisOptions);
        var repo = new Lazy<ISagaRepository<CreditTransactionSaga>>(
            () => new RedisSagaRepository<CreditTransactionSaga>(() => redis.GetDatabase()));

        var busControl = Bus.Factory.CreateUsingRabbitMq(x =>
        {
            IRabbitMqHost host = x.Host(new Uri("rabbitmq://link-to-rabbit"), h =>
            {
                h.Username("guest");
                h.Password("guest");
            });

            x.ReceiveEndpoint(host, "queueName", e =>
            {
                e.PrefetchCount = 8;
                e.StateMachineSaga(machine, repo.Value);
            });
        });

        busControl.Start();
        Console.Out.WriteLine("Bus started.");

因此,当我在队列中收到消息时,状态机开始处理它,但随后出现 NotImplementedByDesignException

完整的堆栈跟踪是

  

Redis saga存储库不支持   queriesMassTransit.NotImplementedByDesignException:Redis saga   存储库不支持查询   MassTransit.RedisIntegration.RedisSagaRepository 1.SendQuery[T](SagaQueryConsumeContext 2   context,ISagaPolicy 2 policy, IPipe 1 next)в   MassTransit.Saga.Pipeline.Filters.QuerySagaFilter`2。&gt; -Send&gt; d__6.MoveNext()---

看起来RedisSagaRepository不应该使用SendQuery方法,但在QuerySagaFilter中它显式调用,我看不到解决方法。

是否有任何有关RedisSagaRepository初始化的工作示例或建议如何在不调用SendQuery的情况下使用它?

1 个答案:

答案 0 :(得分:0)

我发现避免 RedisSagaRepository.SendQuery 方法的唯一方法是 在配置状态机事件时使用 EventCorrelationConfigurator.CorrelateById 方法而不是 EventCorrelationConfigurator.CorrelateBy

所以它应该在你的所有模型中都有一个关联Guid,由状态机消耗。希望它对任何人都有帮助。