我有一个要求,如果我从消息驱动的bean调用的服务(Restful服务)关闭或者没有返回成功,我需要将rollBack消息返回队列,等待一段时间(指数)然后再次读取消息从队列中尝试连接到服务。
我在尝试什么:
在OnMessage
方法中,如果我从调用Restful服务的服务收到异常,我将使用messageDrivenContext.setRollBackOnly()
回滚,我可以执行类似Thread.sleep(RETRY_WAIT_TIME)
的操作;
但我如何确保RETRY_WAIT_TIME
呈指数级增长?
可能我需要保持bean的状态,但有人可以建议我怎么做吗?
答案 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向容器抛出异常时,某些应用程序服务器已经逐渐增加了读取消息的重试时间。同样,一些排队系统允许配置让消息在队列中的某个时间出现。检查基础架构的规范在该主题上的描述。