Предыдущий отзыв
предыдущий постОписывает концепции, связанные с управляемой событиями моделью в Spring. Длина ключа знакомит с механизмом событий Spring. Модель Spring, управляемая событиями, состоит из трех частей: событие, издатель и подписчик. Определение и реализация этих трех частей анализируются в сочетании с исходным кодом Spring. В этой статье в основном объединены конкретные примеры для объяснения событийно-ориентированного подхода в Spring. Автор пишетПодписка и публикация событий в Spring Cloud BusКогда я писал две статьи, я подумал о том, чтобы дополнить объяснение событийно-управляемой модели в Spring, что также является более базовым знанием.
Применение управляемого событиями шаблона в Spring
Для обновления нашего примера информации о конфигурации, когда сервер конфигурации получает отправленное событие конфигурации, он запускает каждую службу для ответа на обновление своей собственной конфигурации. Конкретный код выглядит следующим образом:
мероприятие
public class ConfigRefreshEvent extends ApplicationEvent {
public ConfigRefreshEvent(final String content) {
super(content);
}
}
Определите событие для обновления конфигурации. наследоватьApplicationEvent
То есть контент — это объект, который необходимо передать.
определить слушателя
Определите два сервиса, оба реализованыSmartApplicationListener
, интерфейс наследуется отApplicationListener
а такжеOrdered
Интерфейс, который является расширением стандартных прослушивателей, предоставляет больше метаданных, таких как поддерживаемые типы событий и упорядочиваемые прослушиватели.
public interface SmartApplicationListener extends ApplicationListener<ApplicationEvent>, Ordered {
/**
* 决定该监听器是否支持给定的事件
*/
boolean supportsEventType(Class<? extends ApplicationEvent> eventType);
/**
* 决定该监听器是否支持给定的目标类型,支持才会调用
*/
boolean supportsSourceType(Class<?> sourceType);
}
Код для двух Сервисов размещен ниже.
ServiceAListener
@Component
public class ServiceAListener implements SmartApplicationListener {
@Override
public boolean supportsEventType(final Class<? extends ApplicationEvent> eventType) {
return eventType == ConfigRefreshEvent.class;
}
@Override
public boolean supportsSourceType(final Class<?> sourceType) {
return sourceType == String.class;
}
@Override
public void onApplicationEvent(final ApplicationEvent event) {
System.out.println("ServiceA收到新的配置:" + event.getSource());
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
ServiceBListener
@Component
public class ServiceBListener implements SmartApplicationListener {
@Override
public boolean supportsEventType(final Class<? extends ApplicationEvent> eventType) {
return eventType == ConfigRefreshEvent.class;
}
@Override
public boolean supportsSourceType(final Class<?> sourceType) {
return sourceType == String.class;
}
@Override
public void onApplicationEvent(final ApplicationEvent event) {
System.out.println("ServiceB收到新的配置:" + event.getSource());
}
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
}
тестовый класс
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTest {
@Autowired
private ApplicationContext applicationContext;
@Test
public void testPublishEvent() {
System.out.println("发布配置更新:");
ConfigRefreshEvent event = new ConfigRefreshEvent("配置信息更新了")
applicationContext.publishEvent(event);
}
}
Выше приведен наш тестовый класс, который эквивалентен издателю события. Сначала определите событие обновления конфигурации, а затем передайте внедренныйApplicationContext
Опубликовать это событие.
Из-за приоритета serviceA над Serviceb мы видим следующие результаты:
发布配置更新:
ServiceA收到新的配置:配置信息更新了
ServiceB收到新的配置:配置信息更新了
Суммировать
Эта статья относительно проста и основана на управляемой событиями модели Spring, представленной в предыдущей статье, и специально применяется к сценарию обновления конфигурации. Модель Spring, управляемая событиями, использует шаблон Observer. пройти черезApplicationEvent
абстрактные классы иApplicationListener
интерфейс, который может реализовать определение и мониторинг событий,ApplicationContext
Осуществляет публикацию события. используется в примереSmartApplicationListener
Стандартный интерфейс мониторинга событий расширен: когда слушатель обрабатывает событие, он может судить о входящем событии и устанавливать приоритет слушателя. О механизме горячего обновления Spring Cloud я напишу позже, который также основан на событийно-управляемой модели Spring.