【问题标题】:Pausing in between Retries of Network Connections在网络连接重试之间暂停
【发布时间】:2009-02-11 09:25:49
【问题描述】:

我正在为 JBoss Java EE 服务器编写一个应用程序。我希望数据库访问代码非常健壮。因此,我创建了重试循环,以便请求不会因为临时网络问题而失败。现在我希望请求的执行在重试之间暂停。

服务器线程是由对 Axis Web 服务的请求产生的。让服务器线程进入睡眠状态是否安全,或者我是否必须为此生成一个自己的线程?

【问题讨论】:

    标签: java database multithreading jakarta-ee


    【解决方案1】:

    是的,您可以使用 Thread.currentThread().sleep(XXX) 使线程进入睡眠状态。但是你应该限制尝试的次数,否则如果出现长时间的网络问题,线程会一直挂起那么久。

    【讨论】:

      【解决方案2】:

      如果您正在尝试让进程重新连接到数据库以防连接丢失,您最好让 JBoss 为您处理,只需在 JBoss 中定义您的数据源,它就会为您管理一个连接池,验证连接并丢弃不再有效的连接,以便您始终获得有效的连接。

      【讨论】:

        【解决方案3】:

        试图控制 JBoss 服务器中的线程最终会给您带来更多问题,并很快成为一场噩梦。 JBoss 已经很好地管理了数据库连接和事务;因此,除非您的数据库位于本地网络之外的某个地方,否则您的事务不太可能因为网络中断而失败。此外,在您的业务方法(ala 会话 bean)中添加“重试”逻辑也不是一个好主意,因为这会引入长时间运行的事务,这会导致事务超时和实体锁定问题 - 这会让您处于同一条船上网络中断的可能性越小。

        通常,您会在客户端捕获任何回滚错误并在那里处理重试。但是,如果您确实需要在服务器端引入“重试”行为,我建议您利用 MessageDrivenBeans 异步执行这些操作。当客户端调用会话 bean 上的方法时,不是运行业务逻辑,而是构造 JMS 消息并将其传递到本地队列。该消息将包含被调用方法的名称和客户端传递的参数映射。侦听该队列将是一个 MDB,它解构消息以直接执行业务逻辑,或调用会话 bean 以执行逻辑。如果有事务回滚,则将消息推回队列并稍后重新传递到 MDB。

        对于 JBoss 4.2.3 消息传递,您可以将以下属性添加到您的 JMS 消息中以控制传递时间以及 JBoss 应等待多长时间才能在失败后重新传递消息:

        • JMS_JBOSS_SCHEDULED_DELIVERY - 交货时间以毫秒为单位
        • JMS_JBOSS_REDELIVERY_DELAY - 重新投递前等待的毫秒数

        您可以在将这些值推送到队列之前将它们添加到消息中 - 操作从 MDB 传递的消息是行不通的。另外请注意,如果一条消息被传递太多次(默认为 10 次),那么该消息将被移动到交易信队列 (DLQ)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-31
          • 1970-01-01
          • 1970-01-01
          • 2021-01-16
          相关资源
          最近更新 更多