masstransit - Masstransit Sagas - 事件未发布
问题描述
尝试使用 MT 和 Automatonymous 进行传奇设置,但是没有点击,文档很薄,不清楚我的配置中有什么不正确。
我可以看到生成总线的队列,然后是状态机的主题。但是,当我发布事件时,什么也没有发生。没有例外,队列或主题中没有任何内容。
设置和注册:
var repository = new InMemorySagaRepository<MyObJect>();
var _machine = new MyStateMachine();
var _busControl = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
{
var host = cfg.Host("omitted", h => { });
cfg.UseSerilog(logger);
cfg.ReceiveEndpoint(host, "test", e =>
{
e.StateMachineSaga(_machine, repository);
});
cfg.UseServiceBusMessageScheduler();
});
_busControl.Start();
状态机:
public class MyStateMachine:
MassTransitStateMachine<MyObJect>
{
public MyStateMachine()
{
InstanceState(x => x.CurrentState);
this.Event(() => this.ItemAdded, x => x.CorrelateById(c => c.Message.CorrelationId).SelectId(c => c.Message.CorrelationId));
this.Event(() => this.ItemSubmitted, x => x.CorrelateById(c => c.Message.CorrelationId));
Initially(
When(ItemAdded)
.ThenAsync(context =>
{
return context.Data.AddItem();
//Update everything you need to on the current instance of the state machine
})
.TransitionTo(Added)
);
During(Added,
When(ItemSubmitted)
.Then(ct => ct.Data.SubmitItem())
.TransitionTo(Submitted)
.Finalize()
);
SetCompletedWhenFinalized();
}
public Event<ItemAdded> ItemAdded { get; private set; }
public Event<ItemSubmitted> ItemSubmitted { get; private set; }
public State Added { get; private set; }
public State Submitted { get; private set; }
}
public class ItemSubmitted
{
public string ItemId { get; set; }
public string EntityId { get; set; }
public System.Guid CorrelationId { get; set; }
public void SubmitItem()
{
System.Threading.Thread.Sleep(30000);
Console.WriteLine("Submitted the item");
}
}
public class ItemAdded
{
public string ItemId { get; set; }
public string EntityId { get; set; }
public System.Guid CorrelationId { get; set; }
public Task AddItem()
{
return Task.FromResult(true);
}
}
状态机实例:
public class MyObJect: SagaStateMachineInstance
{
public string CurrentState { get; set; }
public string EntityId { get; set; }
public string ItemId { get; set; }
public Guid CorrelationId { get; set; }
}
通过以下方式发布事件:
_busControl.Publish<MyObJect>(new MyObJect { EntityId = "123", ItemId = "435", CorrelationId = Guid.NewGuid() }).Wait();
原谅糟糕的代码和人为的例子——我把它煮成了一个小工具,让我的头更容易绕起来
解决方案
您似乎误解了传奇状态是什么。saga state 是你的状态机的状态。它包含您的流程的数据,并被持久化到数据库中。
您需要消息来推动您的传奇,这就是您需要使用的定义
public Event<ItemAdded> ItemAdded { get; private set; }
如果你想通过ItemAdded
事件启动 saga 并在收到ItemSubmitted
事件时继续,你需要发布ItemAdded
. MyObject
是传奇状态,而不是消息类型。
推荐阅读
- ios - 升级到 Xcode 版本 10.2 (10E125) 后如何更正错误
- c# - 如果字符串值不为空或为空,则在字符串中添加“|”
- jetty - 带有 Jersey 和嵌入式 Jetty 的 CrossOriginFilter
- android - 如果项目存在于数据库中,Android Firestore 更新字段值
- wordpress - 如何在 wordpress 发布后向 mailchimp 自动化发送电子邮件
- typescript - 将值传递到量角器中黄瓜的不同步骤
- javascript - Angular:你能提取文本响应类型的状态吗?
- javascript - 离线时此测验如何获得答案?
- java - 访问者模式中 List.of() 的使用
- jira - Jira:工单显示为已解决,分辨率设置为无