與 log4j2用asyncRoot配置異步日志是如何使用disruptor差異有幾個:
給disruptor實例的EventFactory不同
此處EventFactory采用的是RingBufferLogEvent.FACTORY,newInstance邏輯大致是:
public RingBufferLogEvent newInstance() {
final RingBufferLogEvent result = new RingBufferLogEvent();
if (Constants.ENABLE_THREADLOCALS) {
result.messageText = new StringBuilder(Constants.INITIAL_REUSABLE_MESSAGE_SIZE);
result.parameters = new Object[10];
}
return result;
}
創建的是 RingBufferLogEvent
實例。該對象封裝了日志輸出的執行動作等。
給disruptor的threadFactory的參數不同
thread factory的名字是"AsyncLogger[" + contextName + "]"
給disruptor的EventHandler不同
此處用RingBufferLogEventHandler,對接RingBufferLogEvent實例處理日志寫出。
給disrupto的Translator不同
此處用RingBufferLogEventTranslator,對接RingBufferLogEvent實例組裝日志信息。
事件進入隊列方式不同
封裝了一個叫tryPublish的方法進入隊列。