发送第二个IAmStarted消息时无法创建新NServiceBus Saga实例
问题分析与解决方案
问题根源:测试方式错误
你遇到的异常并非NServiceBus Saga的配置问题,而是测试代码的逻辑错误:你直接复用了同一个SimpleSaga实例来处理两条不同的启动消息。在NServiceBus的实际运行机制中,当收到IAmStartedByMessages类型的消息且匹配不到现有Saga实例时,框架会自动创建新的Saga实例;但你的测试代码强行让两条消息共用同一个实例,导致第二条消息处理时使用的是第一条消息设置的ProcessId,自然触发异常。
正确的测试方式:使用NServiceBus测试框架
必须用NServiceBus官方的NServiceBus.Testing包来编写Saga测试,它会模拟框架的实例管理逻辑,自动为不同关联ID的消息创建独立的Saga实例。
修正后的测试代码示例
[Test] public async Task Test_Saga_Creates_New_Instance_For_Different_ProcessId() { // 初始化可测试的Saga实例,配置消息映射 var testableSaga = Saga<SimpleSaga>.New(config => { config.ConfigureMapping<StartProcessingSimpleSagaCommand>(msg => msg.ProcessId); }); // 发送第一条启动命令 await testableSaga.Send(new StartProcessingSimpleSagaCommand { ProcessId = "OneReg1" }); // 验证第一条命令创建了对应实例 Assert.That(testableSaga.Exists(data => data.ProcessId == "OneReg1"), Is.True); // 发送第二条启动命令 await testableSaga.Send(new StartProcessingSimpleSagaCommand { ProcessId = "OneReg2" }); // 验证第二条命令创建了独立的新实例 Assert.That(testableSaga.Exists(data => data.ProcessId == "OneReg2"), Is.True); Assert.That(testableSaga.Count(), Is.EqualTo(2)); }
额外验证点
- Saga数据类检查:确保
SimpleSagaData中的ProcessId属性是可读写的,无特殊限制逻辑。 - 配置排除:你的现有配置中没有限制多Saga实例创建的设置,
LimitMessageProcessingConcurrencyTo(1)仅限制消息并发处理数,不影响实例创建逻辑。
内容的提问来源于stack exchange,提问作者mr_city
相关产品推荐
相关产品推荐

