EventBus
발행: (2026년 1월 9일 오후 04:43 GMT+9)
2 min read
원문: Dev.to
Source: Dev.to
SimpleEventBus 구현
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
// Concrete EventBus implementation
public class SimpleEventBus implements MyEventBus {
private final ConcurrentHashMap>> listenersMap = new ConcurrentHashMap<>();
// Publish an event to all listeners of a source
public void push(String source, T event) {
List> listeners = listenersMap.get(source);
if (listeners != null && !listeners.isEmpty()) {
for (MyEventListener listener : listeners) {
try {
listener.onEvent(source, event);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
// Get number of subscribers for a source
public int getSubscriberCount(String source) {
List> listeners = listenersMap.get(source);
return (listeners == null) ? 0 : listeners.size();
}
@Override
public void subscribe(String source, MyEventListener listener) {
listenersMap.computeIfAbsent(source, key -> new CopyOnWriteArrayList<>()).add(listener);
}
@Override
public void unsubscribe(String source, MyEventListener listener) {
listenersMap.computeIfPresent(source, (key, list) -> {
list.remove(listener);
return list.isEmpty() ? null : list;
});
}
}
사용 예시
위에 제시된 EventBus는 Guava의 EventBus와 유사한 EventBus 구현입니다. 별도로 자세히 설명할 필요는 없습니다.
class MessageListener implements MyEventListener {
private final String name;
public MessageListener(String name) { this.name = name; }
@Override
public void onEvent(String source, Message event) {
System.out.println(name + " received from [" + source + "]: " + event.getText());
}
}