石英电子邮件处理器的良好架构

时间:2014-08-19 10:26:38

标签: quartz-scheduler quartz.net

我需要编写一个Windows服务来发送电子邮件。电子邮件可能会存储在数据库表中,应尽可能早地发送。让多个线程发送消息会有好处,因为在一天中的某些时候会有伤害但是多次发送相同的消息是不好的。

所以我在这种情况下理解如何最好地利用quartz.net来缓解一些排队和并发问题。所以我的架构问题是: 1.对于这种情况,作业最好是检查是否有电子邮件要发送,或者作业是否应该实际发送一封电子邮件? 2.如果1)的答案是检查要发送的电子邮件那么这会给我带来并发问题,我需要使用DisallowConcurrentExecution,这会导致一次只发送一封电子邮件? 3.如果答案1)是发送一封电子邮件,那么我认为工作细节需要反映要发送的电子邮件的具体ID? 4.在任何一种情况下 - 两个Web用户可以触发创建相同的电子邮件作业(同时)。因此,Quartz似乎并没有真正帮助解决我的问题 - 它可能为一个工作单元提供一个很好的架构并控制轮询频率,但实际上并不是我问题的核心?或者我在思考/思考什么?

最后,为了清楚起见,每封电子邮件都与特定订单相关,因此具有ID和州潜力。因此,因为两个网络用户可以在同一时刻发送相同的电子邮件,所以不应该导致发送两封电子邮件。

期待任何建议。 谢谢 约什

1 个答案:

答案 0 :(得分:0)

Quartz.Net可满足您的日程安排需求。

但是,您的需求存在冲突。你想要"多个线程"发送电子邮件,但您也想要"不想要重复的电子邮件"。

DisallowConcurrentExecution将阻止同一个作业的多个实例同时运行。但是,如果您只有一个作业实例正在运行,则您不知道哪些个人电子邮件已发送或未发送。

如果你只保留"这些电子邮件已经发送过,而且这些电子邮件还没有发送过。在记忆中.....你总是有发送重复的风险。

你可以解决这个问题,但你必须要有一个悲观的"已发送电子邮件的标志。就像在数据库级别一样。

所以如果你想要多个线程发送电子邮件......那没关系。但是你要发送一些电子邮件"代码必须标记'它正在处理的电子邮件。 (所以下一个线程没有得到它们)。然后你必须在发送后立即再次标记它们。

Quartz适合安排"当"你的工作运行。但它没有能力跟踪"您需要发送哪些电子邮件以及哪些已发送。这将是你的责任。

我遇到了类似的问题....我有很多用户试图"得到"一堆待办事项。这就是为什么我为Sql Server编写这个博客条目的原因。我需要"标记"行,但也必须在我标记之前对它们进行排序。

http://granadacoder.wordpress.com/2009/07/06/update-top-n-order-by-example/

我还添加了一些"提示" .......

WITH ( UPDLOCK, READPAST , ROWLOCK ) –<<Optional Hints

因为有这么多不同的用户试图&#34; get-at&#34;这些物品。

(想想T1cket M @ ster如何工作.......门票上必须有一些悲观的锁定......他们有一个计时器,如果你不打开锁定器就会释放锁定。及时买票。

希望有所帮助。