消息驱动Bean并以指数退避重试

时间:2016-01-19 13:40:23

标签: java-ee jms message-driven-bean

我有一个要求,如果我从消息驱动的bean调用的服务(Restful服务)关闭或者没有返回成功,我需要将rollBack消息返回队列,等待一段时间(指数)然后再次读取消息从队列中尝试连接到服务。

我在尝试什么:

OnMessage方法中,如果我从调用Restful服务的服务收到异常,我将使用messageDrivenContext.setRollBackOnly()回滚,我可以执行类似Thread.sleep(RETRY_WAIT_TIME)的操作;

但我如何确保RETRY_WAIT_TIME呈指数级增长?

可能我需要保持bean的状态,但有人可以建议我怎么做吗?

1 个答案:

答案 0 :(得分:1)

根据您的设置,有多种方法可以实现此目的。如果所有消息都将调用相同的服务,则可以在MDB上下文中定义全局限制参数,该参数定义让MDB休眠的时间。您可以使用基本的指数延迟,例如:

final int throttleTime = 60;  //Assume we delay 60 sec before retry
int throttle = 1;

private int getThrottle(){
  throttle = throttleTime * throttle;
  return throttle;
}

private void resetThrottle(){
  throttle = 1;
}

public void onMessage(Message message){
  try{
     service.invoke();
  } catch (InvocationException e) {
    try{
      Thread.sleep(getThrottle()*1000);
      onMessage(message);
    } catch (InterruptedException e) {
      logger.error(e.getMessage());
    }
  } finally {    
    resetThrottle();
  }
}       

注意当MDB向容器抛出异常时,某些应用程序服务器已经逐渐增加了读取消息的重试时间。同样,一些排队系统允许配置让消息在队列中的某个时间出现。检查基础架构的规范在该主题上的描述。