Создание уведомлений
Вы можете создавать уведомления через административный интерфейс или программно в коде.
Административный интерфейс
После добавления дополнения в ваше приложение в главном меню появляется пункт Notifications. Экран Notifications предоставляет список созданных уведомлений и кнопки для управления ими.
Редактор уведомлений появляется после нажатия кнопки Create notification.
В диалоговом окне доступны следующие поля для заполнения:
-
Subject – тема уведомления.
-
Type – тип уведомления. Типов уведомлений по умолчанию нет. Смотрите раздел настройка, чтобы создать типы.
-
Recipients – список получателей уведомления. Начните вводить имя пользователя в поле и выберите подходящих пользователей из списка.
-
Channels – канал, используемый для уведомления.
-
In-app channel – пользователь получит уведомление в пользовательском интерфейсе приложения.
-
Email channel – пользователь получит email с уведомлением (доступно с дополнением Email).
-
-
Body – основное содержимое уведомления.
Программное создание
Сервис NotificationManager предоставляет методы для отправки уведомлений пользователям.
В примере ниже уведомление отправляется пользователю каждый раз, когда создается новый заказ.
Данный сценарий относится к категории событий жизненного цикла сущности (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 на панели действий, чтобы сгенерировать код для отправки уведомлений. |