Создание уведомлений

Вы можете создавать уведомления через административный интерфейс или программно в коде.

Административный интерфейс

После добавления дополнения в ваше приложение в главном меню появляется пункт Notifications. Экран Notifications предоставляет список созданных уведомлений и кнопки для управления ими.

ntf list

Редактор уведомлений появляется после нажатия кнопки Create notification.

ntf editor

В диалоговом окне доступны следующие поля для заполнения:

  • Subject – тема уведомления.

  • Type – тип уведомления. Типов уведомлений по умолчанию нет. Смотрите раздел настройка, чтобы создать типы.

  • Recipients – список получателей уведомления. Начните вводить имя пользователя в поле и выберите подходящих пользователей из списка.

  • Channels – канал, используемый для уведомления.

    • In-app channel – пользователь получит уведомление в пользовательском интерфейсе приложения.

    • Email channel – пользователь получит email с уведомлением (доступно с дополнением Email).

  • Body – основное содержимое уведомления.

Программное создание

Сервис NotificationManager предоставляет методы для отправки уведомлений пользователям.

В примере ниже уведомление отправляется пользователю каждый раз, когда создается новый заказ.

ntf programmatic

Данный сценарий относится к категории событий жизненного цикла сущности (Entity Lifecycle Events). Эта логика должна выполняться при создании новой сущности заказа. Фреймворк Jmix генерирует событие EntityChangedEvent каждый раз, когда сущность создается, обновляется или удаляется в базе данных.

Для обработки этого события необходимо определить слушателя событий (event listener) в виде Spring-бина. Метод, который обрабатывает EntityChangedEvent, должен быть аннотирован @TransactionalEventListener, чтобы гарантировать его выполнение только после того, как сущность будет закоммичена в базе данных.

import com.company.notificationsex1.entity.Order;
import io.jmix.core.DataManager;
import io.jmix.core.event.EntityChangedEvent;
import io.jmix.notifications.NotificationManager;
import io.jmix.notifications.channel.impl.InAppNotificationChannel;
import io.jmix.notifications.entity.ContentType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.event.TransactionalEventListener;

@Component
public class OrderEventListener {

    private static final Logger log = LoggerFactory.getLogger(OrderEventListener.class);
    @Autowired
    private DataManager dataManager;
    @Autowired
    protected NotificationManager notificationManager;

    @TransactionalEventListener (1)
    @Transactional(propagation = Propagation.REQUIRES_NEW) (2)
    public void onOrderChangedAfterCommit(final EntityChangedEvent<Order> event) {
        try {
            if (event.getType() == EntityChangedEvent.Type.CREATED) {
                Order order = dataManager.load(event.getEntityId()).one();

                notificationManager.createNotification() (3)
                        .withSubject("New order")(4)
                        .withRecipientUsernames("admin") (5)
                        .toChannelsByNames(InAppNotificationChannel.NAME) (6)
                        .withContentType(ContentType.PLAIN) (7)
                        .withBody("A new order with number " + order.getNumber() + " is created.") (8)
                        .send(); (9)
            }
        } catch (Exception e) {
            log.error("Error processing order", e);
        }
    }
}
1 Ожидает события EntityChangedEvent после коммита транзакции, что гарантирует, что запись заказа уже сохранена в базе данных.
2 Открывает новую транзакцию для загрузки и сохранения данных. Это необходимо, потому что текущая транзакция уже закрыта после коммита. Без этого вызовы dataManager.load() или dataManager.save() завершились бы ошибкой из-за отсутствия активной транзакции.
3 Инициирует NotificationRequestBuilder, который создает новый объект NotificationRequest.
4 Определяет тему уведомления.
5 Устанавливает получателя по указанному имени пользователя.
6 Устанавливает каналы уведомлений по указанным именам. Доступны in-app и email.
7 Устанавливает тип содержимого тела уведомления.
8 Устанавливает основное содержимое уведомления.
9 Создает и отправляет запрос на уведомление.
Нажмите Code Snippets на панели действий, чтобы сгенерировать код для отправки уведомлений.