Разработка универсальной структуры диспетчеризации сообщений
Я работаю над структурой рассылки сообщений для сценария использования издателя-подписчика, где подписчики могут зарегистрироваться для сообщения определенного типа и предоставить обработчик для этого сообщения. Использовал дженерики, так как он позволял легко расширять и меньше кода, а также облегчал использование фреймворка, но застрял на месте. Хотите знать, могу ли я сделать это лучше?
Интерфейс для каждого обработчика событий
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" в диспетчере. Было бы проблемой, если бы кто-то забыл это сделать. Есть ли лучший способ?