Wildfly - MDB прекращает обработку других сообщений после возникновения ошибки в одном сообщении
Чтобы упростить проблему, я настроил MDB только с одним сеансом.
import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.inject.Inject;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import org.slf4j.Logger;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/queue/adwordsReportRequest"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "veiculo = 'adwords'"),
@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "1"),
@ActivationConfigProperty(propertyName = "transactionTimeout", propertyValue = "7500") })
public class ReportRequestReceiveDispatcherAdwords implements MessageListener {
@Resource
private MessageDrivenContext mdc;
@Inject
private Logger logger;
private Integer count = 0;
public ReportRequestReceiveDispatcherAdwords() {
// TODO Auto-generated constructor stub
}
public void onMessage(Message inMessage) {
TextMessage msg = null;
String text = null;
try {
if (inMessage instanceof TextMessage) {
msg = (TextMessage) inMessage;
text = msg.getText();
if (count >= 10 && count <= 100) {
logger.error("Count: {} - {} - Marcando como erro!", ++count, text);
throw new RuntimeException("teste de erro");
} else
logger.info("Count: {} - {}", ++count, text);
} else {
logger.warn("Message of wrong type: " + inMessage.getClass().getName());
}
} catch (Exception e) {
mdc.setRollbackOnly();
}
}
}
Очередь настроена с 3 попытками и 2 минутами задержки между ними.
<address-setting name="#" dead-letter-address="jms.queue.DLQ" expiry-address="jms.queue.ExpiryQueue" max-delivery-attempts="3" redelivery-delay="120000" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10"/>
Выполнение этого кода с 600 сообщениями в очереди:
14:10 --> it stopped the processing at the first error.
14:12 --> processes 3 messages and stops.
14:14 --> processes 10 messages and stops.
14:16 --> processes 14 messages and stops.
14:18 --> processes 10 messages and stops.
14:20 --> processes 16 messages and stops.
14:22 --> processes 9 messages and stops.
14:24 --> processes 8 messages and stops.
14:26 --> processes 7 messages and stops.
14:28 --> processes 6 messages and stops.
14:30 --> processes 6 messages and stops.
14:32 --> processes 6 messages and stops.
14:34 --> It goes out of the loop that generates error, so it finish the processing of the other messages until the queue is empty.
Почему MDB останавливается, если в очереди все еще есть сообщения? Когда сообщение возвращается в очередь после отката, оно попадает в верхнюю часть, блокируя остальные? Это не имеет никакого смысла для меня. Я не смог найти ни одного документа, где описано это поведение.
Согласно спецификации:
Другие последующие сообщения будут доставляться регулярно, только задержанное сообщение будет отправлено обратно в очередь после задержки. https://activemq.apache.org/artemis/docs/2.0.0/undelivered-messages.html