本文主要研究一下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方法

doc


codecraft
11.9k 声望2k 粉丝

当一个代码的工匠回首往事时,不因虚度年华而悔恨,也不因碌碌无为而羞愧,这样,当他老的时候,可以很自豪告诉世人,我曾经将代码注入生命去打造互联网的浪潮之巅,那是个很疯狂的时代,我在一波波的浪潮上留下...


引用和评论

0 条评论