Java 数据库中的队列管理

Java 数据库中的队列管理,java,spring,hibernate,quartz-scheduler,Java,Spring,Hibernate,Quartz Scheduler,首先,我正在寻找不同的方法来解决这个问题 我在应用程序中有一个队列,它在数据库表中维护。 有一个调度处理器,它将查看队列并根据记录上的状态字段提取记录。 它处理这些记录,并在成功时从表中删除该记录 问题是我的应用程序是群集的。因此,将有多个调度处理器实例,它们将提取相同的记录,然后处理它们 为了解决这个问题,我采用的方法是 我在处理记录之前更新了记录的状态(比如从挂起到工作),并在表的实体映射上添加了一个版本,因此操作的顺序是 1) 查询表中的挂起记录。 2) 将状态更新为“正在工作”。(如果处

首先,我正在寻找不同的方法来解决这个问题

我在应用程序中有一个队列,它在数据库表中维护。 有一个调度处理器,它将查看队列并根据记录上的状态字段提取记录。 它处理这些记录,并在成功时从表中删除该记录

问题是我的应用程序是群集的。因此,将有多个调度处理器实例,它们将提取相同的记录,然后处理它们

为了解决这个问题,我采用的方法是 我在处理记录之前更新了记录的状态(比如从挂起到工作),并在表的实体映射上添加了一个版本,因此操作的顺序是

1) 查询表中的挂起记录。 2) 将状态更新为“正在工作”。(如果处理器的另一个实例在有人已更新记录时尝试更新它,它将给出一个异常,因此将转到下一条记录) 3) 关于成功。删除记录,否则将其更新回挂起状态

现在,这样做可以很好地解决问题,但不太喜欢这个想法

想知道面对类似问题的人是如何解决的

我有另一种方法来解决这个问题,因为同一个应用程序填充了表,所以将表分配给填充它的主机和特定tomcat上的调度处理器,只查找该主机的记录。基本上是尽量减少第一个解决方案将发生的颠簸


这是一个Spring3.0.5和Hibernate应用程序,这是一个非常常见的问题。您可以从不同的方式解决此问题:

  • 通过分配新状态+乐观锁定来拥有当前处理的记录。这是您的方法,它会起作用,但是您必须记住,如果当前正在处理某个节点的节点死亡,那么必须清理表

  • 与上面相同,但是使用悲观锁定-如果有很多节点并且乐观锁定失败经常发生,则可能是更好的方法

  • 外部/全局锁定-一次只有一个节点可以访问整个队列表。可以使用表级锁定来阻止所有其他节点或某些节点

  • 在队列表中放置新记录时,随机化并将其分配给给定节点,以便其他节点无法处理它。不要走这条路,维护噩梦,例如在添加或删除节点时

  • 使用时,它将自动对作业进行群集,并在一个节点上运行作业。它使用与上述类似的技术(共享数据库上的悲观锁定)

  • …或者只是使用普通的JMS提供程序,数据库实际上并不打算用作队列


您看过ZeroMQ或Apache Kafka吗?