У меня есть следующий MessageDrivenBean:
@MessageDriven(mappedName = "jms/...", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "endpointExceptionRedeliveryAttempts", propertyValue = "5"),
@ActivationConfigProperty(propertyName = "endpointExceptionRedeliveryInterval", propertyValue = "1000")
})
public class MyMessageListener implements MessageListener {
@Resource
private MessageDrivenContext context;
@Override
@TransactionAttribute(REQUIRED)
public void onMessage(Message message) {
}
}
Внутри метода onMessage
я выполняю некоторую обработку, которая здесь не важна.В определенных ситуациях я хочу отказаться от обработки.В этих ситуациях я хочу пометить транзакцию только для отката и не хочу повторять попытку.
По крайней мере, на Glassfish 3.1.1, если я вызову context.setRollbackOnly()
на MessageDrivenContext
и завершуПри обработке без исключения исключение сообщение доставляется бесконечно через очень короткие промежутки времени.Так что это не вариант для меня.
Если я добавлю RuntimeException
, сообщение будет доставлено, как я его указал.Он доставляется 5 раз с интервалом в 1 секунду.Но в моем случае я вообще не хочу повторять обработку.
Если я просто завершу обработку без каких-либо исключений и без вызова context.setRollbackOnly()
, транзакция будет зафиксирована, как и следовало ожидать.Но мне нужно откатить транзакцию, потому что, возможно, я уже изменил некоторые сущности JPA.
У меня есть вопрос: как пометить транзакцию только для отката без запуска повторной доставки сообщения?