当前位置: 首页 > 知识库问答 >
问题:

消息驱动bean,并在指数后退的情况下重试

明正德
2023-03-14

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

我正在尝试的是:

OnMessage方法中,如果我从调用Restful服务的服务接收到异常,我将使用messageDrivenContext回滚。setRollBackOnly()我可以执行类似于线程的操作。睡眠(重试等待时间)

但是如何确保重试_等待_时间以指数级增长?

也许我需要保持豆子的状态,但有人能建议我怎么做吗?

共有1个答案

弘兴言
2023-03-14

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

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向容器抛出异常时,一些应用服务器已经逐渐增加了读取消息的重试时间。同样,一些排队系统允许配置在队列中的特定时间显示消息。检查您的基础设施的规格在该主题中描述了什么。

 类似资料:
  • 是否可以在MDB(消息驱动Bean)中为“目的地”动态分配运行时值? 我还尝试了ejb-jar.xml方法,但是“activation-config-property-name”=“destination”的值被理解为队列的文字物理名称。因此我无法对资源进行JNDI查找。 从属性读取和分配目标或使用-d参数传递值的正确方法是什么?

  • 在企业应用程序中,我试图使用netBeans 8.1将MessageDriven beans注入Web应用程序(到REST服务)。我在IDE中没有得到任何警告,但是,在部署时,我得到以下错误: 严重:加载应用程序时出现异常:CDI部署失败:Weld-001408:未满足类型StatisticsBean的依赖关系,其限定符@Default在注入点[BackedAnnotatedField]@Inje

  • 消息驱动Bean是一种企业bean,当EJB容器从队列或主题接收消息时由EJB容器调用。 消息驱动的bean是一个无状态bean,用于异步执行任务。 为了演示消息驱动bean的使用,我们将使用EJB-persistence章节,我们需要执行以下任务 - Step 1 - 在数据库中创建表(请参阅EJB-Persistence章节)。 Step 2 - 创建与表对应的实体类(请参阅EJB-Persi

  • 早上好在我的时区。 事先表示感谢并致以最良好的问候

  • 我有一种在shell中执行此任务的方法:如何使kafka消费者从上次消耗的偏移量读取,而不是从开始读取 但是,我愿意在Python中这样做,使用 我找不到任何关于这种情况的api。 http://kafka-python.readthedocs.io/en/latest/apidoc/KafkaConsumer.html

  • 我为一个做了一个,我想将其推送到我自己的存储库中。然后我做了,由于我忘记添加消息,我在最后收到了一个警告: 我不知道该怎么做,所以我按下了< code>E键,因为我认为这样可以添加一条消息。我得到了这个彩色屏幕作为回报: 我尝试键入类似“添加了txt”之类的消息。“A”被切断了,当我尝试按Enter键时,它只是在cmd中换行以键入更多内容。这个窗口是什么,如何在不单击X按钮的情况下离开这个窗口?我