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