我正在为JBoss Java EE服务器编写一个应用程序。我想让DB访问代码非常强大。因此,我创建了重试循环,以便请求不会因为临时网络问题而失败。现在我希望执行请求在重试之间暂停。
服务器线程已由对Axis Web Service的请求生成。将服务器线程置于睡眠状态是安全的还是我必须为此生成自己的线程?
答案 0 :(得分:1)
是的,您可以使用Thread.currentThread()。sleep(XXX)将线程置于休眠状态。但是你应该限制尝试次数,否则如果长网络问题,线程会长时间保持挂起状态。
答案 1 :(得分:1)
如果您正在尝试将进程重新连接到数据库以防连接丢失,那么最好让JBoss为您处理,只需在JBoss中定义数据源,它就会为您管理连接池,验证连接并丢弃不再有效的连接,以便始终获得有效连接。
答案 2 :(得分:1)
试图控制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)。