【问题标题】:Masstransit saga using redis integration cause exceptionMasstransit saga 使用 redis 集成导致异常
【发布时间】:2018-01-24 14:31:12
【问题描述】:

我正在使用 RedisSagaRepository 在我的应用程序中使用 MassTransit sagas。 初始化看起来像

        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 仓库不支持 queryMassTransit.NotImplementedByDesignException: Redis 传奇 存储库不支持查询 в MassTransit.RedisIntegration.RedisSagaRepository1.SendQuery[T](SagaQueryConsumeContext2 上下文,ISagaPolicy2 policy, IPipe1 下一个)в MassTransit.Saga.Pipeline.Filters.QuerySagaFilter`2.>-Send>d__6.MoveNext()---

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

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

【问题讨论】:

    标签: redis masstransit


    【解决方案1】:

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

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

    【讨论】:

    • 没错,Redis 库不支持超出主 ID 索引的任何内容。不知道你会怎么做,或者如果可能的话,我不使用 REdis。
    • 我没有找到比使用 CorrelationId 将我的 long id 转换为 Guid 更好的方法。希望将来写另一个 repo 来通过 Linq2DB 或其他东西连接我的 Oracle 数据库
    • 将 long 转换为 Guid 是这样做的正确方法。 id 应该是确定性的,应该是 Guid,仅此而已。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多