我有一个要求,即当db中的记录未按指定的时间间隔更新/更改时,我必须发送警报。例如,如果收到的采购订单未在一小时内处理,则应将提醒发送给交货经理。
提醒/提醒应该以间隔(包括秒)发送。如果上次修改时间是13:55:45,则应该触发警报14:55:45。可能需要跟踪数百万行。
简单的方法可能是实现自定义调度程序,所有记录都将在其中注册。但是应该轮询数据库以每秒查找更改,这将导致性能问题。
更新:
另一种基本方法是为每条记录创建一个线程并将其置于休眠状态1小时(或)使用一些具有超时的排队概念。但它仍有性能问题
有关更好的实施方法的想法吗?
答案 0 :(得分:2)
可能使用内部JMS队列将是更好的解决方案 - 例如,您可能希望使用带有hornetq的预定消息功能http://docs.jboss.org/hornetq/2.2.2.Final/user-manual/en/html/examples.html#examples.scheduled-message。
您可以要求经纪人在1小时后发布提醒消息。另一方面,在处理某些交易活动期间,您可以手动删除此消息,这意味着交易活动已经过处理而没有错误。
答案 1 :(得分:2)
为每个提醒使用Timer.i.e。如果上次修改时间是17:49:45,则应该在18:49:45触发警报,只需为一小时后即可完全调用的每个任务创建一个动态计时器安排。
答案 2 :(得分:2)
如果你真的坚持“实时性”,那么Java是不可能的。在Java中,您可能会对垃圾收集器的世界末日进行封锁,您无法保证确切的时间。
如果大概时间也是允许的,那么使用其他答案中提出的某种调度队列,如果不是,则使用实时Java或一些本地调用。
答案 3 :(得分:0)
如果我们可以假设订单的输入时间越来越长,那么:
您可以将Queue
与包含time-of-order
和order-id
属性的元素结合使用。
添加到数据库的每个新条目也会排入此Queue
。
您可以在每分钟Queue
的开头检查元素。
在Queue
开头检查元素时,如果time-of-order
已经过了一小时,则在数据库中搜索order-id
条目。
如果找到并且未更新,则发送通知,否则将其从Queue
出列。