0

我有 2 台相同的独立 JBoss 5.1 服务器。我正在编写一个定期唤醒以处理队列的应用程序,该队列在 Oracle 数据库中实现为表。

伪代码是:

  1. 醒来。
  2. 现在的时间是早上 7 点到晚上 7 点之间吗?如果是,请继续。如果没有,请继续睡 5 分钟。
  3. 读取“队列”表中第一行的内容
  4. 将 HTTP POST 发送到另一台服务器,其中包含在步骤 3 中读取的内容。
  5. 如果 POST 成功,则删除该行。否则,将行留在表中。
  6. 移动到下一行并重复步骤 3-5,直到表格结束。
  7. 睡5分钟。

我的问题是:如何确保一行不被处理两次(导致两个 POST)?

是否有我可以利用的 JavaEE 注释,或者 JBoss 内置的锁定机制?

理想的解决方案将导致应用程序以相同的方式部署到两台服务器;也就是说,同一个应用程序驻留在两个节点中。

4

2 回答 2

1

如果您不能使用 JMS 队列(在这种情况下应该是自然的选择),您可以使用 HA Singleton。它就像集群范围的单例一样工作,当具有活动单例的服务器崩溃时,单例在第二台服务器上被激活。

在您的情况下,单例 bean 可以在两个服务器(本地和远程)之间分离工作,那么就不需要使用任何锁。

我在 JBoss 7.1 上使用了 ha-singleton,但此功能也可用于 Jboss 5.x(查看此处)。

于 2013-06-19T21:06:18.233 回答
0

您可以使用具有多个使用者的 JMS 队列。

如果配置正确,每条消息将只传递给一个消费者,JMS 提供者将在多个消费者之间进行“负载平衡”。

于 2013-06-19T20:46:22.627 回答