我有一个要求,如果我从消息驱动bean调用的服务(Restful服务)关闭或没有返回成功,我需要将消息回滚到队列,等待一段时间(指数),然后再次从队列读取消息,并尝试连接到服务。
我正在尝试的是:
在OnMessage
方法中,如果我从调用Restful服务的服务接收到异常,我将使用messageDrivenContext回滚。setRollBackOnly()
我可以执行类似于线程的操作。睡眠(重试等待时间)
;
但是如何确保重试_等待_时间
以指数级增长?
也许我需要保持豆子的状态,但有人能建议我怎么做吗?
根据您的设置,有多种方法可以实现这一点。如果所有消息都将调用相同的服务,您可以在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按钮的情况下离开这个窗口?我