Несколько экземпляров боба - PullRequest
0 голосов
/ 31 марта 2012

Я реализую класс слушателя, который прослушивает некоторые события и затем обрабатывает их. Если обработка этого события идет хорошо, то это событие никогда не уведомляется снова, но в случае какого-либо исключения событие через некоторое время снова будет уведомлено классу MyBeanImplementation, и он может снова попытаться обработать его.

Следующий код работает нормально, но поскольку обработка этого события может занять некоторое время,
1. Я хочу иметь несколько слушателей.
2. Ограничить количество обращений к сервису, возможно использование пула потоков.

Как я могу иметь несколько слушателей, которые будут обрабатывать каждое событие по-разному? Я новичок в Spring и не очень понимаю, возможно ли это или нет.

Вот пример:

// Конфигурация пружины:

<bean id="MyBean" class="MyBeanImplementation">

// Образец класса

public class MyBeanImplementation implements EventListener {

    @override
    public processEvent(Event event) throws EventProcessFailureException {
        try {
            // Validate event
            validateEvent(event);
            // Call another service to store part of information from this event
            // This service takes some time to return success
            boolean success = makeCallToServiceAndStoreInfo(event);
            if(!success) {
                throw new EventProcessFailureException("Error storing event information!");
            }
        } catch (Exception e) {
            throw new EventProcessFailureException(e);
        }
    }

}


Спасибо

Ответы [ 2 ]

0 голосов
/ 01 апреля 2012

Почему бы не использовать библиотеку Google Guava Eventbus с Spring вместе?Он будет обрабатывать все, что нужно для прослушивания событий.

0 голосов
/ 31 марта 2012

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

<bean id="strategy1Listener" />
<bean id="strategy2Listener" />
<bean id="strategy3Listener" />

Затем вы можете ввести составной слушатель, чтобы перебрать других слушателей и пройти через событие и позволить им обработать событие:

<bean id="compositeStrategyListener">
  <property name="listeners">
    <list>
      <ref bean="strategy1Listener" />
      <ref bean="strategy2Listener" />
      <ref bean="strategy3Listener" />
    </list>
  </property>
</bean>

С другой стороны истории у вас есть объект, который генерирует / публикует события:

<bean id="eventGenerator">
  <property name="eventListener" ref="compositeStrategyListener" />
</bean>

Итак, теперь eventGenerator публикует сгенерированное событие в compositeStrategyListner, который выполняет итерацию по слушателями позволяет им обрабатывать событие по-своему.

Вы также можете воспользоваться Spring Task Execution , чтобы настроить способ запуска задачи обработки события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...