Статьи

Локальная шина сообщений

Недавно мне стало интересно, как я могу улучшить архитектуру прослушивателя TestNG.

TestNG предоставляет множество различных прослушивателей, которые пользователи могут указать перед началом пробного запуска (с использованием командной строки, ant, Maven, testng.xml или программно).

Эти слушатели говорят вам, когда:

  • Тест пройден успешно, не пройден или пропущен.
  • Тестовый метод должен быть вызван и когда он вернется.
  • Конфигурационный метод начинается или заканчивается (существует пять типов каждого: набор, тест, класс, метод и группа, и у вас есть события до и после для каждого).
  • Репортер должен быть уведомлен об обновлении его результатов (либо в конце запуска комплекта, либо после каждого метода тестирования).

Все эти слушатели улавливаются с помощью различных интерфейсов , и они развивались несколько органически за эти последние шесть лет , как потребность и запросы появились, показывая некоторое перекрытие в функциональности , а также требует эволюции неудобного интерфейса, Java навязывает ( Приложение A и экспонат B ).

Одним из возможных решений такой проблемы является шина сообщений (или событий).

Шины сообщений существовали очень давно, и большинство моих кандидатских диссертаций были посвящены их использованию и влиянию на распределенные приложения. Я даже написал один для моего доктора под названием Коала Talk . Это было около 1993 года, почти двадцать лет назад.

Де — факто стандартом в мире Java является спецификация JMS, которая была реализована во многих продуктах , таких как ActiveMQ или RabbitMQ. Как спецификация, так и реализации прошли боевые испытания и доказали свою полезность для современного программного обеспечения.

Тем не менее, JMS излишне для того, что мне нужно сделать. Прежде всего, с точки зрения функциональности, но также и более просто, потому что мне нужна локальная программная шина, которая всегда будет передавать сообщения в одной и той же JVM. Нет сети необходимо.

Модель шины сообщений вносит много упрощений в сложную среду слушателя, такую ​​как TestNG. Вместо того, чтобы решать, какой интерфейс и какой метод применять, когда все, что нужно TestNG, это публиковать события по мере выполнения тестового прогона. Где эти события обрабатываются и кого они в конечном итоге достигают, определяется вне механизма TestNG.

Еще одним преимуществом является то, что рассмотрение системы с точки зрения событий позволит устранить немало частичных совпадений. Например, в TestNG вы можете получать уведомления как о завершении комплекта, так и о том, когда ваш репортер должен начать выполнять свою работу (генерировать отчеты). В большинстве случаев эти события совпадают.

Я начал рисовать, как может выглядеть такой API, и пришел к следующему очень раннему проекту:

public class App {

@Subscriber
public void event1(NotifyEvent ne) {
System.out.println("event1: " + ne);
}

}
MessageBus mb = new MessageBus();
mb.register(new App());
mb.post(new NotifyEvent("notify"));

Получатели описывают интересующие их события, а издатели просто публикуют их. Имея в виду эти идеи, я начал осматриваться вокруг, чтобы увидеть, существует ли что-то подобное, и я быстро наткнулся на EventBus Майкла Буша.

EventBus оказывается очень близким к тому, что я имел в виду, включая поддержку аннотаций и диспетчеризацию на основе типов. EventBus также поддерживает все виды других механизмов, некоторые из которых я имел в виду (публикация на основе строк с соответствием регулярному выражению, наследование событий) и несколько других, о которых я не думал (вето).

EventBus, кажется, очень обширный, очень хорошо спроектированный и протестированный (отличная работа, Майкл!), Но, вероятно, слишком большой для того, что мне нужно. Он также содержит довольно много ссылок на Swing, потому что он, очевидно, начинался как библиотека поддержки для приложений Swing, которые публикуют события (с чем постоянно сталкиваются разработчики Swing). Следует признать, что есть часть EventBus, которая кажется независимой от графики, но я не смог по-настоящему понять ее полную степень и можно ли вообще ее вырезать (меня не интересует перетаскивание зависимостей Swing).

Интересно, что это единственная библиотека такого типа, которую мне удалось найти, поэтому, прежде чем копать дальше, кто-нибудь слышал о фреймворке, обеспечивающем такую ​​простую функцию публикации / подписки внутри JVM, которую я ищу?

 

С http://beust.com/weblog/2010/07/26/local-message-bus/