Azure eventhub 从MassTransit BehaviorContext向EventHub Rider发布消息

Azure eventhub 从MassTransit BehaviorContext向EventHub Rider发布消息,azure-eventhub,masstransit,Azure Eventhub,Masstransit,的文档建议使用IEventHubProducerProvider(MassTransit.EventHubnuget包的一部分)向EventHub发送消息。但是,大多数MassTransit文档建议,当发布来自消息使用者的消息时,开发人员应使用“”来发布消息。在我的应用程序中,我希望在两种不同的上下文中托管相同的MassTransitStateMachine: 当它使用内存总线时,它与其他生产者和消费者之间的所有消息都是同一过程的一部分 使用事件中心附加程序接收和发布消息 在我看来,最干净的实现

的文档建议使用
IEventHubProducerProvider
(MassTransit.EventHubnuget包的一部分)向EventHub发送消息。但是,大多数MassTransit文档建议,当发布来自消息使用者的消息时,开发人员应使用“”来发布消息。在我的应用程序中,我希望在两种不同的上下文中托管相同的
MassTransitStateMachine

  • 当它使用内存总线时,它与其他生产者和消费者之间的所有消息都是同一过程的一部分
  • 使用事件中心附加程序接收和发布消息
  • 在我看来,最干净的实现方式是将发布消息的所有配置推迟到总线配置,而根本不依赖消息使用者中的
    MassTransit.EventHub
    。这让我问了一个问题,“我可以发布带有的消息并将消息发送到EventHub上吗?或者我必须依赖
    IEventHubProducerProvider
    (或者提供我自己的内存实现,在引擎盖下使用ConsumerContext?)”


    如有任何关于如何做到这一点的指导,我们将不胜感激。看起来,
    IEventHubProducerProvider
    与不一致,但更可能的是,我只是不明白一些事情。

    如果您从状态机中向事件中心生成消息,则可以使用
    product
    扩展方法。它们与
    PublishAsync
    扩展方法具有相同的签名,但将消息定向到事件中心

    例如(摘自下表):

    最初(
    何时(开始)
    .Then(context=>context.Instance.Key=context.Data.TestKey)
    .product(x=>Configuration.EventHubName,x=>x.Init(新的{Text=$“键:{x.Data.TestKey}”)
    .过渡到(主动);
    
    如果您正在从状态机中向事件中心生成消息,则可以使用
    product
    扩展方法。它们与
    PublishAsync
    扩展方法具有相同的签名,但将消息定向到事件中心

    例如(摘自下表):

    最初(
    何时(开始)
    .Then(context=>context.Instance.Key=context.Data.TestKey)
    .product(x=>Configuration.EventHubName,x=>x.Init(新的{Text=$“键:{x.Data.TestKey}”)
    .过渡到(主动);
    
    我不知道
    product
    扩展方法!它们似乎很接近/也许正是我想要的。如果我在未定义EventHub附加程序的不同应用程序中注册相同的MassTransitStateMachine(即,所有生产者/消费者连接到同一台机器上的同一内存总线,即未定义EventHubName(也称为“主题名”)概念的传输),这样的调用是否只是通过总线发送消息,还是会导致其他问题?如果没有事件中心生成器,则可能会导致问题。如果您想这样做,您可能需要删除事件中心对象,以避免在没有事件中心附加程序时出现异常。仔细看,似乎
    product
    方法依赖于
    EventActivityBinder
    而不是自定义活动中可用的
    BehaviorContext
    。该服务需要实现一点有状态的逻辑(对于Saga实例状态列表中的每个值,发送一份接收到的消息副本,将correlationId设置为当前迭代值),现在似乎无法在Automatonymous中“迭代Saga实例状态集合并为每个实例生成”。
    product
    是否可以与
    BehaviorContext
    一起使用?在这种情况下,您需要为状态机创建自己的活动,并依赖于productor,并将逻辑放入该活动中。有很多状态机活动的例子,你甚至可以看看实际的感谢。。。这就是我遇到的。我创建了一个抽象的“生成消息到主题”事件发布器,其中包含不同的实现(一个用于EventHub传输,一个用于内存),然后创建了依赖于抽象事件发布器的自定义活动。活动可以检查抽象事件发布者,并决定将其消息放入其中或活动自己的BehaviorContext Publish方法(内存传输、将消息发布到的其他非附加通道)。我不知道
    生成
    扩展方法!它们似乎很接近/也许正是我想要的。如果我在未定义EventHub附加程序的不同应用程序中注册相同的MassTransitStateMachine(即,所有生产者/消费者连接到同一台机器上的同一内存总线,即未定义EventHubName(也称为“主题名”)概念的传输),这样的调用是否只是通过总线发送消息,还是会导致其他问题?如果没有事件中心生成器,则可能会导致问题。如果您想这样做,您可能需要删除事件中心对象,以避免在没有事件中心附加程序时出现异常。仔细看,似乎
    product
    方法依赖于
    EventActivityBinder
    而不是自定义活动中可用的
    BehaviorContext
    。该服务需要实现一点有状态的逻辑(对于Saga实例状态列表中的每个值,发送一份接收到的消息副本,将correlationId设置为当前迭代值),现在似乎无法在Automatonymous中“迭代Saga实例状态集合并为每个实例生成”。
    product
    是否可以与
    BehaviorContext
    一起使用?在这种情况下,您需要为状态机创建自己的活动,并依赖于productor,
    Initially(
        When(Started)
            .Then(context => context.Instance.Key = context.Data.TestKey)
            .Produce(x => Configuration.EventHubName, x => x.Init<EventHubMessage>(new {Text = $"Key: {x.Data.TestKey}"}))
            .TransitionTo(Active));