ActiveMQ 消息排序 - JMSException 的会话回滚?
ActiveMQ message ordering - Session rollback for JMSException?
我有一个 Spring JMS 消费者 class,它从队列中读取消息(实现 SessionAwareMessageListener)并处理它们以发送到 Web 服务。我们需要保留消息到达和处理的顺序,因为它们包含对相同数据的增量更新。
为确保这一点,我们在发生任何可恢复的故障(例如服务超时)时回滚侦听器中的会话,以便再次重试相同的消息。但是,如果消息格式无效或包含错误数据,则会被丢弃(会话不会回滚)。
如果 message.getText() 方法抛出 JMSException,我不清楚是否应该回滚会话。这可以被认为是可恢复的错误,还是应该在发生此错误时丢弃该消息?
代码看起来像这样:
public void onMessage(Message message, Session session) throws JMSException {
try {
String msgText = ((TextMessage) message).getText();
// Processing occurs
// Web service is called
} catch (JMSException jmse) {
// log error
session.rollback(); // Question about this line
} catch (InvalidMessageException ime) {
// log error
// session is NOT rolled back, proceed to next message
} catch (SocketTimeoutException | AnyOtherRecoverableException excp) {
// log error
session.rollback();
}
}
为了保持顺序(排序),如果由于 JMS 提供程序(MQ 服务器)故障而出现任何异常,则必须回滚消息。
另请从 oracle 文档中的 getText() 方法中找到以下文本:
TextMessage getText() method Throws:
JMSException - if the JMS provider fails to get the text due to some internal error
我有一个 Spring JMS 消费者 class,它从队列中读取消息(实现 SessionAwareMessageListener)并处理它们以发送到 Web 服务。我们需要保留消息到达和处理的顺序,因为它们包含对相同数据的增量更新。
为确保这一点,我们在发生任何可恢复的故障(例如服务超时)时回滚侦听器中的会话,以便再次重试相同的消息。但是,如果消息格式无效或包含错误数据,则会被丢弃(会话不会回滚)。
如果 message.getText() 方法抛出 JMSException,我不清楚是否应该回滚会话。这可以被认为是可恢复的错误,还是应该在发生此错误时丢弃该消息?
代码看起来像这样:
public void onMessage(Message message, Session session) throws JMSException {
try {
String msgText = ((TextMessage) message).getText();
// Processing occurs
// Web service is called
} catch (JMSException jmse) {
// log error
session.rollback(); // Question about this line
} catch (InvalidMessageException ime) {
// log error
// session is NOT rolled back, proceed to next message
} catch (SocketTimeoutException | AnyOtherRecoverableException excp) {
// log error
session.rollback();
}
}
为了保持顺序(排序),如果由于 JMS 提供程序(MQ 服务器)故障而出现任何异常,则必须回滚消息。
另请从 oracle 文档中的 getText() 方法中找到以下文本:
TextMessage getText() method Throws:
JMSException - if the JMS provider fails to get the text due to some internal error