Модель, управляемая событиями, в Spring (2)

задняя часть сервер Spring

Предыдущий отзыв

предыдущий постОписывает концепции, связанные с управляемой событиями моделью в 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.

Подписывайтесь на свежие статьи, приглашаю обратить внимание на мой публичный номер

微信公众号