我有一个客户端从队列接收消息。我目前有一个MessageListener
来实现onMessage()
。
收到邮件后,会进一步处理,然后保存到onMessage()
方法的数据库中;然后客户确认收到消息。
只要数据库启动就没有问题。但如果数据库关闭,客户端将不会确认。
为了满足这一需求,我希望客户端按计划的时间间隔向队列发送任何未确认的消息。
实际上,我这样做的唯一方法是重新启动不理想的客户端。有没有办法触发队列重新发送未确认的消息而不重启?
onMessage()
中的内容:
//code to connect to queue
try {
if (DB is available){
//process message
//save required details to DB
msg.acknowledge();
}
else{
//schedule to request same message later from queue
}
} catch (Exception e) {}
答案 0 :(得分:0)
我认为标准行为已经按照您的意愿行事:如果消息代理使用相同的数据库并且数据库不可用,它将不接受消息,因此客户端将假脱机,直到消息代理准备就绪试。
如果它们不共享同一个数据库且消息代理已打开,它将假脱机并在onMessage
抛出异常时重试。
消息代理将尝试根据其可配置策略重新发送。
答案 1 :(得分:0)
经过一些更多的研究,我偶然发现了session.recover(),我可以使用它来触发重新传递。我已经看到有RedeliveryPolicy类,我可以用它来设置消息重发选项。现在我的代码看起来像:
ConnectionFactory factory = new ActiveMQConnectionFactory(url);
RedeliveryPolicy policy = new RedeliveryPolicy();
policy.setBackOffMultiplier((short) 2);
policy.setRedeliveryDelay(30000);
policy.setInitialRedeliveryDelay(60000);
policy.setUseExponentialBackOff(true);
((ActiveMQConnectionFactory)factory).setRedeliveryPolicy(policy);
final Session session = connection.createSession(false,
Session.CLIENT_ACKNOWLEDGE);
...
...
...
..
//inside onMessage()
try {
if (DB is available){
//process message
//save required details to DB
msg.acknowledge();
}
else{
session.recover();
}
} catch (Exception e) {}