用石英/调度实现大规模公共交通-是否有任何示例实现?

8

我已经费尽心思地寻找了有关如何使用Mass Transit的Quartz集成(https://github.com/MassTransit/MassTransit-Quartz)的实例实现或博客文章。

目前,我只能通过查看代码库中附带的单元测试来进行操作,但是进展不大。

是否有任何示例或优秀的博客文章可以帮助我开始使用Mass Transit和Quartz调度?


2
四年过去了,我仍然找不到一个像样的例子。我的消息被安排并进入石英队列,但它们始终处于“运行”状态,但我的消费者从未确认消息或执行工作。 - Interesting
你找到解决方案了吗?! - Mazdak
1个回答

7
这个例子可以让你将MassTransit的计划消息存储在SQL数据库中。默认情况下,MassTransit只在内存中保存,需要进行一些配置更改才能持久化。
首先,你需要对你的app/web.config文件进行微调,并包含以下两个块:
<configSections>
<section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />

 <quartz>
<add key="quartz.scheduler.instanceName" value="MassTransit-Quartz" />
<add key="quartz.scheduler.instanceId" value="AUTO" />
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.threadPool.threadCount" value="4" />
<add key="quartz.threadPool.threadPriority" value="2" />
<add key="quartz.jobStore.misfireThreshold" value="60000" />

<add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
<add key="quartz.jobStore.useProperties" value="false" />

<add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz" />
<add key="quartz.jobStore.clustered" value="true" />
<add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
<add key="quartz.jobStore.dataSource" value="quartzDS" />

<add key="quartz.dataSource.quartzDS.connectionString" value="Server=(local);Database=Quartz;Integrated Security=SSPI" />
<add key="quartz.dataSource.quartzDS.provider" value="SqlServer-20" />

接下来,在你的本地SQL中创建一个名为“Quartz”的新数据库,下载quartz.net源代码并找到数据库脚本

"tables_sqlServer.sql"

运行该脚本以在Quartz本地数据库中创建架构。 现在你已经准备好将计划消息持久化到数据库中,你需要从MassTransit Quartz集成库中订阅这两个消费者:

var scheduler = CreateScheduler();      
sb.SubscribeConsumer(() => new ScheduleMessageConsumer(scheduler));
sb.SubscribeConsumer(() => new CancelScheduledMessageConsumer(scheduler));

其中 scheduler 是 IScheduler 接口的一个实例:

static IScheduler CreateScheduler()
{
    ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
    return schedulerFactory.GetScheduler();
}

你需要创建一个类型为IServiceBus的服务总线 sb。

最后,在你的代码中调用:

 Bus.ScheduleMessage(SchedulePeriodInSecondsFromNow, MessageToSchedule); 

你需要为 "MessageToSchedule" 类型创建一个消费者。 如果你打开数据库并查询 QRTZ_TRIGGERS 表,你会看到工作在那里出现,以及在 QRTZ_JOB_DETAILS 中。

希望这可以帮到你!


1
还有其他步骤缺失,以便将消息从数据库返回到MassTransit吗?如果我没错的话,ScheduleMessageConsumer会将消息转换为Quartz并保存它们,但似乎应该有其他处理它们的东西。我在GitHub上看到了一个MassTransitJobFactory,但似乎无法正确设置它。 - mikebridge
1
MikeBridge - 我已经有一段时间没有看过这个了,对于延迟表示歉意。在我的实现中,我最终没有使用MassTransit Quartz集成库,因为我需要可重复的作业,而MassTransit并不支持或不支持。下一部分可能会回答你的问题 - 我必须实现"IJob"、一个空构造函数和public void Execute(IJobExecutionContext context)。 - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接