// Path: electrons/src/main/java/com/ziyuan/ElectronsHolder.java
// public final class ElectronsHolder {
// 
//     /**
//      * 电子
//      */
//     private Electron electron;
// 
//     /**
//      * 要执行的监听器，这里已经排好序了
//      */
//     private List<ElectronsListener> listeners;
// 
//     public Electron getElectron() {
//         return electron;
//     }
// 
//     public void setElectron(Electron electron) {
//         this.electron = electron;
//     }
// 
//     public List<ElectronsListener> getListeners() {
//         return listeners;
//     }
// 
//     public void setListeners(List<ElectronsListener> listeners) {
//         this.listeners = listeners;
//     }
// 
//     /**
//      * 处理
//      *
//      * @throws Exception 处理过程中的异常，同样抛出去
//      */
//     public boolean handle() throws Exception {
//         if (CollectionUtils.isEmpty(listeners)) {
//             return false;
//         }
//         for (ElectronsListener listener : listeners) {
//             listener.onEvent(electron);
//         }
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return electron.getSource().getClass().getSimpleName() + " - ";
//     }
// }
// 
// Path: electrons/src/main/java/com/ziyuan/exceptions/OpNotSupportException.java
// public class OpNotSupportException extends Exception {
// 
//     public OpNotSupportException() {
//         super("Operation not support !");
//     }
// }


import com.ziyuan.ElectronsHolder;
import com.ziyuan.exceptions.OpNotSupportException;
import java.io.Serializable;
import java.util.concurrent.TimeUnit;
package com.ziyuan.channel;



/**
 * Channel
 *
 * @author ziyuan
 * @since 2017-03-08
 */
public interface Channel extends Serializable {

    /**
     * 根据disruptor开启一个通道
     */
    void open();

    /**
     * 关闭管道
     */
    void close();

    /**
     * 发布事件
     */
    boolean publish(ElectronsHolder electronsHolder) throws Exception;

    /**
     * 同步处理
     */
    boolean handle(ElectronsHolder electronsHolder) throws OpNotSupportException;

    /**
     * 配置限流
     *
     * @param limitRate
     * @param perSecond
     * @param warmup
     * @param warmupPeriod
     * @param unit
     */
// Path: electrons/src/main/java/com/ziyuan/ElectronsHolder.java
// public final class ElectronsHolder {
// 
//     /**
//      * 电子
//      */
//     private Electron electron;
// 
//     /**
//      * 要执行的监听器，这里已经排好序了
//      */
//     private List<ElectronsListener> listeners;
// 
//     public Electron getElectron() {
//         return electron;
//     }
// 
//     public void setElectron(Electron electron) {
//         this.electron = electron;
//     }
// 
//     public List<ElectronsListener> getListeners() {
//         return listeners;
//     }
// 
//     public void setListeners(List<ElectronsListener> listeners) {
//         this.listeners = listeners;
//     }
// 
//     /**
//      * 处理
//      *
//      * @throws Exception 处理过程中的异常，同样抛出去
//      */
//     public boolean handle() throws Exception {
//         if (CollectionUtils.isEmpty(listeners)) {
//             return false;
//         }
//         for (ElectronsListener listener : listeners) {
//             listener.onEvent(electron);
//         }
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return electron.getSource().getClass().getSimpleName() + " - ";
//     }
// }
// 
// Path: electrons/src/main/java/com/ziyuan/exceptions/OpNotSupportException.java
// public class OpNotSupportException extends Exception {
// 
//     public OpNotSupportException() {
//         super("Operation not support !");
//     }
// }


// Path: electrons/src/main/java/com/ziyuan/channel/Channel.java
import com.ziyuan.ElectronsHolder;
import com.ziyuan.exceptions.OpNotSupportException;
import java.io.Serializable;
import java.util.concurrent.TimeUnit;

package com.ziyuan.channel;



/**
 * Channel
 *
 * @author ziyuan
 * @since 2017-03-08
 */
public interface Channel extends Serializable {

    /**
     * 根据disruptor开启一个通道
     */
    void open();

    /**
     * 关闭管道
     */
    void close();

    /**
     * 发布事件
     */
    boolean publish(ElectronsHolder electronsHolder) throws Exception;

    /**
     * 同步处理
     */
    boolean handle(ElectronsHolder electronsHolder) throws OpNotSupportException;

    /**
     * 配置限流
     *
     * @param limitRate
     * @param perSecond
     * @param warmup
     * @param warmupPeriod
     * @param unit
     */
    void confLimitRate(boolean limitRate, double perSecond, boolean warmup, int warmupPeriod, TimeUnit unit);