如何为MassTransit中courier消息单独配置UseMessageRetry重试规则
解决方案
MassTransit 重试配置支持多粒度规则设置,全局配置为最低优先级的兜底规则,你可以通过以下两种方式为特定 Courier 类型消息配置独立重试规则:
方案1:按Courier活动粒度配置(推荐)
如果你需要为特定的 ExecuteActivity / CompensateActivity 单独设置重试,直接在活动配置节点下添加重试规则即可,该规则优先级会覆盖全局配置:
// 注册Courier活动时单独配置重试 config.AddActivity<你自定义的活动类, 对应活动参数类>(activityCfg => { activityCfg.UseMessageRetry(retryCfg => { // 替换为你需要的独立重试规则 retryCfg.Exponential(3, TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(5), TimeSpan.FromMilliseconds(500)); // 可选:仅针对特定异常触发重试 retryCfg.Handle<自定义可重试异常>(); // 可选:排除特定异常不触发重试 retryCfg.Ignore<不可重试异常>(); }); }); // 原有全局重试规则保留,作为其他消息的兜底配置 config.UseMessageRetry(x => { x.Incremental(100, TimeSpan.FromSeconds(1), TimeSpan.FromMilliseconds(100)); });
方案2:按消息类型全局筛选配置
如果你需要对某一类Courier消息全局生效独立规则,可以通过Include/Exclude方法筛选消息类型:
// 先配置特定消息类型的专属重试规则 config.UseMessageRetry(retryCfg => { // 筛选你要单独配置的Courier消息类型 retryCfg.Include<Courier消息类型1>(); retryCfg.Include<Courier消息类型2>(); // 专属重试规则 retryCfg.Incremental(5, TimeSpan.FromSeconds(2), TimeSpan.FromMilliseconds(200)); }); // 原有全局兜底重试规则放在后面 config.UseMessageRetry(x => { x.Incremental(100, TimeSpan.FromSeconds(1), TimeSpan.FromMilliseconds(100)); });
注意事项
- 管道配置顺序需要遵循:更细分的规则放在全局规则之前,否则细分规则会被全局规则覆盖
- 活动级重试规则优先级高于消息级筛选的重试规则,也高于全局规则
- 不同层级的重试规则不会叠加,只会优先生效最高优先级的那一套规则
内容的提问来源于stack exchange,提问作者Mohammad Bigdeli
相关产品推荐
相关产品推荐

