You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MassTransit/Quartz.NET内存模式调度正常但持久化模式不生效

问题原因
  • 自定义创建的Quartz调度器未显式启动:持久化模式下Quartz默认不会自动启动调度器实例,你代码中仅获取了IScheduler实例但没有调用Start()方法,调度器不会扫描数据库中的定时Job触发执行。
  • 缺少MassTransit的Quartz集成配置:手动注册ScheduleMessageConsumer和CancelScheduledMessageConsumer时,没有配置适配MassTransit的Job工厂,Quartz默认工厂创建的定时任务无法获取IBus实例,导致到点后无法发送消息。
  • Quartz配置项错误:quartz.jobStore.useProperties设为true时会强制将JobDataMap中的复杂类型转为字符串存储,MassTransit存储在JobDataMap中的消息元数据、发送地址等复杂结构反序列化失败,任务无法正常执行。
解决方案

步骤1:修改Quartz配置

将QuartzConfig中的useProperties配置改为false:

public QuartzConfig(string connectionString)
{
    // 其他原有配置不变
    // 原配置 this["quartz.jobStore.useProperties"] = "true";
    this["quartz.jobStore.useProperties"] = "false";
}

步骤2:启动Quartz调度器

修改CreateScheduler方法,获取调度器实例后显式调用启动方法:

static async Task<IScheduler> CreateScheduler()
{
    var dbConnectionString = "Host=localhost;Database=scheduler;Port=5432;Password=pass;User ID=user;Pooling=true;MaxPoolSize=200;Enlist=true";
    var quartzConfig = new QuartzConfig(dbConnectionString)
        .ToNameValueCollection();

    ISchedulerFactory schedulerFactory = new StdSchedulerFactory(quartzConfig);
    var scheduler = await schedulerFactory.GetScheduler();
    // 显式启动调度器
    await scheduler.Start();
    return scheduler;
}

步骤3:使用MassTransit官方Quartz集成配置

替换手动注册消费者的逻辑,使用MassTransit提供的扩展方法自动配置适配的Job工厂和消费者:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureServices((hostContext, services) =>
        {
            var scheduler = CreateScheduler().GetAwaiter().GetResult();
            services.AddSingleton(scheduler);
            
            services.AddMassTransit(x =>
            {
                x.AddConsumer<MessageConsumer>();
                // 注册Quartz相关消费者
                x.AddQuartzConsumers();

                x.UsingRabbitMq((context, cfg) =>
                {
                    // 自动配置Quartz调度端点
                    cfg.UseQuartzScheduler(scheduler, "quartz");
                    // 配置消息调度器地址
                    cfg.UseMessageScheduler(new Uri("exchange:quartz"));
                    
                    cfg.ConfigureEndpoints(context);
                });
            });
            services.AddMassTransitHostedService();

            services.AddHostedService<Worker>();
        });

步骤4:确认Quartz数据库表初始化

提前执行Quartz官方对应PostgreSQL版本的建表脚本,确保所有QRTZ_开头的表结构完整正确。

内容的提问来源于stack exchange,提问作者FGBfye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 10:24:03