序
本文主要研究一下puma的Dispatcher
Dispatcher
puma/puma/src/main/java/com/dianping/puma/sender/dispatcher/Dispatcher.java
public interface Dispatcher extends LifeCycle {
String getName();
void dispatch(ChangedEvent event, PumaContext context) throws DispatcherException;
List<Sender> getSenders();
}
- Dispatcher定义了getName、dispatch、getSenders方法
AbstractDispatcher
puma/puma/src/main/java/com/dianping/puma/sender/dispatcher/AbstractDispatcher.java
public abstract class AbstractDispatcher implements Dispatcher {
private String name;
/*
* (non-Javadoc)
*
* @see com.dianping.puma.common.LifeCycle#start()
*/
@Override
public void start() {
}
/*
* (non-Javadoc)
*
* @see com.dianping.puma.common.LifeCycle#stop()
*/
@Override
public void stop() {
}
/*
* (non-Javadoc)
*
* @see com.dianping.puma.sender.dispatcher.Dispatcher#getName()
*/
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
protected void throwExceptionIfNeeded(List<Throwable> exceptionList) throws DispatcherException {
if (exceptionList != null && !exceptionList.isEmpty()) {
StringWriter buffer = new StringWriter();
PrintWriter out = null;
try {
out = new PrintWriter(buffer);
for (Throwable exception : exceptionList) {
exception.printStackTrace(out);
}
} finally {
if (out != null) {
out.close();
}
}
throw new DispatcherException(buffer.toString());
}
}
}
- AbstractDispatcher定义了throwExceptionIfNeeded方法,它将exceptionList转换为DispatcherException
SimpleDispatcherImpl
puma/puma/src/main/java/com/dianping/puma/sender/dispatcher/SimpleDispatcherImpl.java
public class SimpleDispatcherImpl extends AbstractDispatcher {
private static final Logger log = Logger.getLogger(SimpleDispatcherImpl.class);
private List<Sender> senders;
/**
* @return the senders
*/
public List<Sender> getSenders() {
return senders;
}
/**
* @param senders
* the senders to set
*/
public void setSenders(List<Sender> senders) {
this.senders = senders;
}
@Override
public void start() {
for (Sender sender : senders) {
sender.start();
}
super.start();
}
@Override
public void stop() {
for (Sender sender : senders) {
sender.stop();
}
super.stop();
}
@Override
public void dispatch(ChangedEvent event, PumaContext context) throws DispatcherException {
if (senders != null && senders.size() > 0) {
List<Throwable> exceptionList = new ArrayList<Throwable>();
for (Sender sender : senders) {
try {
sender.send(event, context);
} catch (Exception e) {
log.error("Exception occurs in sender " + sender.getName());
exceptionList.add(e);
}
}
throwExceptionIfNeeded(exceptionList);
} else {
log.warn("No senders in dispatcher " + getName());
}
}
}
- SimpleDispatcherImpl继承了AbstractDispatcher,其start方法遍历senders,挨个执行sender.start();其stop方法遍历senders,挨个执行sender.stop();其dispatch方法遍历senders,挨个执行sender.send(event, context)
小结
Dispatcher定义了getName、dispatch、getSenders方法;AbstractDispatcher定义了throwExceptionIfNeeded方法,它将exceptionList转换为DispatcherException;SimpleDispatcherImpl继承了AbstractDispatcher,实现了start、stop、dispatch方法
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。