5

我有一个要求,当数据库中的记录在指定的时间间隔内没有更新/更改时,我必须发送警报。例如,如果收到的采购订单在一小时内未处理,则应将提醒发送给交付经理。

提醒/警报应准确地按间隔(包括秒)发送。如果最后修改时间是 13:55:45 意味着,警报应该在 14:55:45 触发。可能需要跟踪数百万行。

简单的方法可能是实现一个自定义调度程序,所有记录都将使用它注册。但是应该每秒轮询数据库以查找更改,这将导致性能问题。

更新:

另一种基本方法是为每个记录创建一个线程并将其置于睡眠状态 1 小时(或)使用一些具有超时的排队概念。但它仍然存在性能问题

对更好的方法来实现相同的想法有什么想法吗?

4

4 回答 4

2

如果您真的坚持“实时性”,那么在 Java 中是不可能的。在 Java 中,您可能会遇到垃圾收集器的 stop-the-world 阶段,并且您永远无法保证准确的时间。

如果近似时间也是允许​​的,则比使用其他答案中建议的某种预定队列,如果不是,则比使用实时 Java 或某些本机调用。

于 2012-08-08T13:22:36.493 回答
2

可能使用内部 JMS 队列会是更好的解决方案 - 例如,您可能想要使用预定消息功能http://docs.jboss.org/hornetq/2.2.2.Final/user-manual/en/html/examples.html# examples.scheduled-message with hornetq。

您可以要求经纪人在 1 小时后发布警报消息。另一方面,在处理某些交易活动期间,您可以手动删除此消息,这意味着交易活动已被正确处理。

于 2012-08-01T07:06:19.607 回答
2

为每个提醒使用计时器。即,如果最后修改时间是 17:49:45,则应在 18:49:45 触发警报,只需为每个任务创建一个动态计时器调度,它将在一小时后准确调用。

于 2012-08-01T12:21:18.540 回答
0

如果我们可以假设随着时间的增加输入订单,那么:

您可以使用Queue具有属性的元素atime-of-orderorder-id

添加到数据库中的每个新条目也将排入此队列Queue

Queue您可以在每分钟开始时检查元素。

在检查 开头的元素时Queue,如果从 开始已经过去了一个小时time-of-order,则在数据库中搜索带有的条目order-id

如果找到并且未更新,则发送通知,否则将其从Queue.

于 2012-08-01T11:48:25.987 回答