Разработка универсальной структуры диспетчеризации сообщений

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

Интерфейс для каждого обработчика событий

public interface EventProcessor<EventType> {
    void processEvent(EventType eventType);
}

Пример обработчика события

public class TestEvent1Handler implements EventProcessor<Event1>{

    public void processEvent(Event1 eventType) {
        System.out.println("Yay! , got event: "+ eventType.getCode());
    }

}

Класс диспетчера событий

public class EventDispatcher {

    private Map<Class, EventProcessor> eventHandlerMap = new 
        HashMap<Class, EventProcessor>();

    public <EventType> void registerProcessor
        (Class<EventType> eventClass, EventProcessor<EventType> processor){
            System.out.println("for "+ eventClass+ " listener is "+ processor);
            eventHandlerMap.put(eventClass, processor);
            System.out.println("successfully registered");
        }

    public void beginDispatching(){


         for(Class eventClass : eventHandlerMap.keySet()){
             String queueName = getQueueNameFromEventClass(eventClass);

             executorPool.submit(
                     new ConsumerThread(queueName, eventHandlerMap.get(eventClass), eventClass));
         }

    }

    private String getTopicNameFromEventClass(Class eventClass) {
        if(eventClass.equals(Event1.class)){
            return "Event1";
        }
        else if(eventClass.equals(Event2.class)){
            return "Event2";
        }
        else{
            return "default";
        }
    }

Пример регистрации EventHandler

    dispatcher.registerProcessor(Event1.class,
            new TestEvent1Handler());

Это работает, но проблема в том, что тот, кто определяет новое сообщение, должен прийти и обновить служебный метод для определения имени темы из класса события - "getTopicNameFromEventClass" в диспетчере. Было бы проблемой, если бы кто-то забыл это сделать. Есть ли лучший способ?

0 ответов

Другие вопросы по тегам