Notification из after commit event

Добрый день!
При попытке отправить сообщение

        notificationManager.createNotification()
            .withSubject(subject)
            .withRecipientUsernames(recipients)
            .toChannelsByNames(channel)
            .withContentType(ContentType.HTML)
            .withBody(body)
            .send()

из after commit event получаем ошибку

No transaction is currently active

Подскажите, пожалуйста, пути обхода. Очень для нас критичный момент.

(Думаю, там примерно та же беда, что и у товарища отсюда:

Наверное, где-то под капотом сидит dataManager, который куда-то сейвит без joinTransaction(false))

(у нас версия 1.5.4)

Добрый день!

Ошибка падает из UserRepository, который пытается достать пользователей через DataManager.

Попробуйте внутри метода сами загрузить пользователей и поставить их в уведомление, например:

@TransactionalEventListener
public void onOrderChangedAfterCommit(final EntityChangedEvent<Order> event) {
    User user = dataManager.load(User.class)
            .query("where e.username = :username")
            .parameter("username", "admin")
            .joinTransaction(false)
            .one();

    notificationManager.createNotification()
            .withSubject("subject")
            .withRecipients(user)
            .toChannelsByNames(InAppNotificationChannel.NAME)
            .withContentType(ContentType.HTML)
            .withBody("Body")
            .send();
}

Мы подумаем что можно сделать, чтобы метод withRecipientUsernames() мог работать и в After Commit слушателе.

1 симпатия

Спасибо, то что надо

Можно также стартовать новую транзакцию для всего метода слушателя:

@TransactionalEventListener
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void onOrderChangedAfterCommit(final EntityChangedEvent<Order> event) {
1 симпатия