Главная » Spring » Обработка извещений Spring

0

Обращение к управляемому компоненту MBean за информаци- ей – это лишь один из способов слежения за состоянием приложе- ния. Но он оказывается не самым эффективным, когда требуется получать информацию о важных событиях, происходящих внутри приложения.

Например, представьте, что в приложении Spitter необходимо по- стоянно вести учет количества отправленных сообщений. И требу- ется сразу же определять каждое миллионное сообщение. Для этого можно написать некоторый программный код, который периодиче-

ски будет выполнять запрос к базе данных, возвращающий коли- чество сообщений. Но процесс, выполняющий такой запрос, будет создавать лишнюю нагрузку на базу данных из-за необходимости постоянной проверки количества сообщений.

Вместо постоянных обращений к базе данных предпочтительнее было бы иметь возможность для управляемых компонентов MBean извещать приложение о важных событиях в моменты, когда они происходят. Извещения JMX, изображенные на рис. 14.5, как раз являются такой возможностью, позволяющей управляемым компо- нентам активно взаимодействовать с внешним миром, вместо того чтобы ждать, пока какое-нибудь внешнее приложение не запросит нужную ему информацию.

Рис. 14.5. Извещения JMX позволяют управляемым компонентам MBean активно взаимодействовать с внешним миром

Поддержка отправки извещений реализована в фреймворке Spring в форме интерфейса NotificationPublisherAware. Любой компонент, превращаемый в управляемый компонент MBean, может реализо- вать этот интерфейс и получить возможность отправлять извеще- ния. Например, в листинге 14.2 представлен класс SpittleNotifierImpl.

Листинг 14.2. Использование интерфейса NotificationPublisherAware для отправки извещений JMX

package com.habuma.spitter.jmx; import javax.management.Notification;

import org.springframework.jmx.export.annotation.ManagedNotification;

import    org.springframework.jmx.export.annotation.ManagedResource;

import      org.springframework.jmx.export.notification.NotificationPublisher; import    org.springframework.jmx.export.notification.

➥NotificationPublisherAware;

import   org.springframework.stereotype.Component;

@Component

@ManagedResource("spitter:name=SpitterNotifier")

@ManagedNotification(

notificationTypes="SpittleNotifier.OneMillionSpittles", name="TODO")

// Реализует интерфейс NotificationPublisherAware public  class  SpittleNotifierImpl

implements NotificationPublisherAware, SpittleNotifier { private   NotificationPublisher   notificationPublisher;

public void setNotificationPublisher( //Внедряется NotificationPublisher NotificationPublisher  notificationPublisher)  {

this.notificationPublisher     =     notificationPublisher;

}

public  void  millionthSpittlePosted()  { notificationPublisher.sendNotification( // Отправка извещения

new Notification( "SpittleNotifier.OneMillionSpittles",    this,    0));

}

}

Как видите, класс SpittleNotifierImpl реализует интерфейс Notifi- cationPublisherAware. Это не слишком сложный интерфейс. Он требу- ет реализовать всего один метод: setNotificationPublisher.

Класс SpittleNotifierImpl реализует также единственный метод ин- терфейса SpittleNotifier1, millionthSpittlePosted(). Для отправки изве- щения об очередном миллионном сообщении этот метод использует компонент NotificationPublisher, который автоматически внедряется посредством метода setNotificationPublisher().

Как только будет вызван метод sendNotification(), извещение от- правится в… хм-м-м… похоже, что мы еще не определили, куда от-

1  Для краткости я опустил интерфейс SpittleNotifier. Но, как можно дога- даться, его единственным методом является метод millionthSpittlePosted.

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

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии