欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

logback高效狀態(tài)管理器StatusManager源碼解析

 更新時(shí)間:2023年11月07日 09:49:35   作者:codecraft  
這篇文章主要為大家介紹了logback高效狀態(tài)管理器StatusManager源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

本文主要研究一下logback的StatusManager

StatusManager

ch/qos/logback/core/status/StatusManager.java

public interface StatusManager {
    /**
     * Add a new status message.
     * 
     * @param status
     */
    void add(Status status);
    /**
     * Obtain a copy of the status list maintained by this StatusManager.
     * 
     * @return
     */
    List<Status> getCopyOfStatusList();
    /**
     * Return the highest level of all the statii.
     * 
     * @return
     */
    // int getLevel();
    /**
     * Return the number of status entries.
     * 
     * @return
     */
    int getCount();
    /**
     * Add a status listener.
     * 
     * @param listener
     */
    /**
     * Add a status listener. The StatusManager may decide to skip installation if
     * an earlier instance was already installed.
     * 
     * @param listener
     * @return true if actually added, false if skipped
     */
    boolean add(StatusListener listener);
    /**
     * ); Remove a status listener.
     * 
     * @param listener
     */
    void remove(StatusListener listener);
    /**
     * Clear the list of status messages.
     */
    void clear();
    /**
     * Obtain a copy of the status listener list maintained by this StatusManager
     * 
     * @return
     */
    List<StatusListener> getCopyOfStatusListenerList();
}
StatusManager接口針對(duì)status定義了add、getCopyOfStatusList、getCount、clear方法,針對(duì)StatusListener定義了add、remove、getCopyOfStatusListenerList方法

BasicStatusManager

ch/qos/logback/core/BasicStatusManager.java

public class BasicStatusManager implements StatusManager {
    final protected List<Status> statusList = new ArrayList<Status>();
    final protected CyclicBuffer<Status> tailBuffer = new CyclicBuffer<Status>(TAIL_SIZE);
    final protected LogbackLock statusListLock = new LogbackLock();
    final protected List<StatusListener> statusListenerList = new ArrayList<StatusListener>();
    final protected LogbackLock statusListenerListLock = new LogbackLock();
    //......
}
BasicStatusManager實(shí)現(xiàn)了StatusManager接口,它使用statusList及statusListLock來(lái)操作status,使用statusListenerList及statusListenerListLock來(lái)操作StatusListener;另外針對(duì)status還提供了tailBuffer

add status

public void add(Status newStatus) {
        // LBCORE-72: fire event before the count check
        fireStatusAddEvent(newStatus);
        count++;
        if (newStatus.getLevel() > level) {
            level = newStatus.getLevel();
        }
        synchronized (statusListLock) {
            if (statusList.size() < MAX_HEADER_COUNT) {
                statusList.add(newStatus);
            } else {
                tailBuffer.add(newStatus);
            }
        }
    }
add方法先加鎖,再判斷是否超出限制,沒(méi)有則添加到statusList,超出則添加到tailBuffer

getCopyOfStatusList

public List<Status> getCopyOfStatusList() {
        synchronized (statusListLock) {
            List<Status> tList = new ArrayList<Status>(statusList);
            tList.addAll(tailBuffer.asList());
            return tList;
        }
    }
getCopyOfStatusList則加鎖,然后從statusList及tailBuffer獲取status

clear

public void clear() {
        synchronized (statusListLock) {
            count = 0;
            statusList.clear();
            tailBuffer.clear();
        }
    }
clear則加鎖,重置count,清空statusList及tailBuffer

add listener

public boolean add(StatusListener listener) {
        synchronized (statusListenerListLock) {
            if (listener instanceof OnConsoleStatusListener) {
                boolean alreadyPresent = checkForPresence(statusListenerList, listener.getClass());
                if (alreadyPresent)
                    return false;
            }
            statusListenerList.add(listener);
        }
        return true;
    }
    private boolean checkForPresence(List<StatusListener> statusListenerList, Class<?> aClass) {
        for (StatusListener e : statusListenerList) {
            if (e.getClass() == aClass)
                return true;
        }
        return false;
    }
add listener方法先加鎖,然后判斷是否已經(jīng)存在,不存在則添加到statusListenerList

remove

public void remove(StatusListener listener) {
        synchronized (statusListenerListLock) {
            statusListenerList.remove(listener);
        }
    }
remove則先加鎖,然后從statusListenerList中移除

getCopyOfStatusListenerList

public List<StatusListener> getCopyOfStatusListenerList() {
        synchronized (statusListenerListLock) {
            return new ArrayList<StatusListener>(statusListenerList);
        }
    }
getCopyOfStatusListenerList則先加鎖然后拷貝statusListenerList

Status

ch/qos/logback/core/status/Status.java

public interface Status {
    int INFO = 0;
    int WARN = 1;
    int ERROR = 2;
    int getLevel();
    int getEffectiveLevel();
    Object getOrigin();
    String getMessage();
    Throwable getThrowable();
    /**
     * @eprecated. Use getTimestamp instead.
     * @return
     */
    @Deprecated
    default Long getDate() {
        return getTimestamp();
    }
    long getTimestamp();
    boolean hasChildren();
    void add(Status child);
    boolean remove(Status child);
    Iterator<Status> iterator();
}
Status接口定義了getLevel、getEffectiveLevel、getOrigin、getMessage、getThrowable、getTimestamp、hasChildren、add、remove、iterator方法

StatusBase

ch/qos/logback/core/status/StatusBase.java

abstract public class StatusBase implements Status {
    static private final List<Status> EMPTY_LIST = new ArrayList<Status>(0);
    int level;
    final String message;
    final Object origin;
    List<Status> childrenList;
    Throwable throwable;
    long timestamp;
    public synchronized void add(Status child) {
        if (child == null) {
            throw new NullPointerException("Null values are not valid Status.");
        }
        if (childrenList == null) {
            childrenList = new ArrayList<Status>();
        }
        childrenList.add(child);
    }
    public synchronized boolean hasChildren() {
        return ((childrenList != null) && (childrenList.size() > 0));
    }
    public synchronized Iterator<Status> iterator() {
        if (childrenList != null) {
            return childrenList.iterator();
        } else {
            return EMPTY_LIST.iterator();
        }
    }
    public synchronized boolean remove(Status statusToRemove) {
        if (childrenList == null) {
            return false;
        }
        // TODO also search in childrens' children
        return childrenList.remove(statusToRemove);
    }
    public synchronized int getEffectiveLevel() {
        int result = level;
        int effLevel;
        Iterator<Status> it = iterator();
        Status s;
        while (it.hasNext()) {
            s = (Status) it.next();
            effLevel = s.getEffectiveLevel();
            if (effLevel > result) {
                result = effLevel;
            }
        }
        return result;
    }
    //......
}
StatusBase聲明實(shí)現(xiàn)Status接口,它通過(guò)childrenList來(lái)存儲(chǔ)子status

InfoStatus

ch/qos/logback/core/status/InfoStatus.java

public class InfoStatus extends StatusBase {
    public InfoStatus(String msg, Object origin) {
        super(Status.INFO, msg, origin);
    }
    public InfoStatus(String msg, Object origin, Throwable t) {
        super(Status.INFO, msg, origin, t);
    }
}
InfoStatus繼承了StatusBase,它的level為Status.INFO

WarnStatus

ch/qos/logback/core/status/WarnStatus.java

public class WarnStatus extends StatusBase {
    public WarnStatus(String msg, Object origin) {
        super(Status.WARN, msg, origin);
    }
    public WarnStatus(String msg, Object origin, Throwable t) {
        super(Status.WARN, msg, origin, t);
    }
}
WarnStatus繼承了StatusBase,它的level為Status.WARN

ErrorStatus

ch/qos/logback/core/status/ErrorStatus.java

public class ErrorStatus extends StatusBase {
    public ErrorStatus(String msg, Object origin) {
        super(Status.ERROR, msg, origin);
    }
    public ErrorStatus(String msg, Object origin, Throwable t) {
        super(Status.ERROR, msg, origin, t);
    }
}
ErrorStatus繼承了StatusBase,它的level為Status.ERROR

小結(jié)

logback定義了StatusManager用于管理status及其listener,其add方法會(huì)回調(diào)listener,之后加鎖,再判斷是否超出限制,沒(méi)有則添加到statusList,超出則添加到tailBuffer;Status是個(gè)接口,它有一個(gè)抽象類為StatusBase,而InfoStatus、WarnStatus、ErrorStatus都繼承了StatusBase。

以上就是logback高效狀態(tài)管理器StatusManager源碼解析的詳細(xì)內(nèi)容,更多關(guān)于logback StatusManager狀態(tài)管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 二叉排序樹(shù)的實(shí)現(xiàn)與基本操作

    二叉排序樹(shù)的實(shí)現(xiàn)與基本操作

    二叉排序樹(shù)又稱二叉查找樹(shù)。本文主要對(duì)二叉排序樹(shù)的實(shí)現(xiàn)與基本操作進(jìn)行詳細(xì)介紹,以下代碼實(shí)現(xiàn)了:1、二叉樹(shù)的構(gòu)建;2、二叉樹(shù)的中、前、后、層序遍歷;3、二叉樹(shù)中結(jié)點(diǎn)的最大距離。下面就跟著小編一起來(lái)看下吧
    2016-12-12
  • Mapper層繼承BaseMapper<T>需要引入的pom依賴方式

    Mapper層繼承BaseMapper<T>需要引入的pom依賴方式

    這篇文章主要介紹了Mapper層繼承BaseMapper<T>需要引入的pom依賴方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot如何接收Post請(qǐng)求Body里面的參數(shù)

    SpringBoot如何接收Post請(qǐng)求Body里面的參數(shù)

    這篇文章主要介紹了SpringBoot如何接收Post請(qǐng)求Body里面的參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java操作集合工具類Collections使用詳解

    Java操作集合工具類Collections使用詳解

    這篇文章主要介紹了java操作集合工具類Collections使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java Lambda表達(dá)式詳解和實(shí)例

    Java Lambda表達(dá)式詳解和實(shí)例

    這篇文章主要介紹了Java Lambda表達(dá)式詳細(xì)介紹,從簡(jiǎn)單的到復(fù)雜的實(shí)例講解,需要的朋友可以參考下
    2014-05-05
  • java實(shí)現(xiàn)圖書(shū)管理系統(tǒng)

    java實(shí)現(xiàn)圖書(shū)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Java語(yǔ)法中Lambda表達(dá)式無(wú)法拋出異常的解決

    Java語(yǔ)法中Lambda表達(dá)式無(wú)法拋出異常的解決

    這篇文章主要介紹了Java語(yǔ)法中Lambda表達(dá)式無(wú)法拋出異常的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring?BeanFactory容器的構(gòu)建和使用示例詳解

    Spring?BeanFactory容器的構(gòu)建和使用示例詳解

    BeanFactory是Spring框架中的一部分,它提供了IoC(控制反轉(zhuǎn))的實(shí)現(xiàn)機(jī)制,下面小編就來(lái)和大家簡(jiǎn)單聊聊BeanFactory容器的構(gòu)建和使用示例吧
    2023-07-07
  • Java SpringMVC異常處理機(jī)制詳解

    Java SpringMVC異常處理機(jī)制詳解

    這篇文章主要介紹了springmvc如何進(jìn)行異常處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • spring boot使用自定義的線程池執(zhí)行Async任務(wù)

    spring boot使用自定義的線程池執(zhí)行Async任務(wù)

    這篇文章主要介紹了spring boot使用自定義的線程池執(zhí)行Async任務(wù)的相關(guān)資料,需要的朋友可以參考下
    2018-02-02

最新評(píng)論