package org.fastcatsearch.processlogger;
import java.util.HashMap;
import java.util.Map;
import org.fastcatsearch.cluster.NodeService;
import org.fastcatsearch.control.JobService;
import org.fastcatsearch.env.Environment;
import org.fastcatsearch.exception.FastcatSearchException;
import org.fastcatsearch.processlogger.log.ProcessLog;
import org.fastcatsearch.service.AbstractService;
import org.fastcatsearch.service.ServiceManager;
import org.fastcatsearch.settings.Settings;
/**
* 작업의 시작과 끝에 반복적으로 히스토리기록관련 할일이 있는 경우 여기에 넣어서 기록할수 있도록 해준다.
* 중복코드를 없애기 위한 서비스.. 차후 없애도 될것같음...
* */
public class ProcessLoggerService extends AbstractService {
private NodeService nodeService;
private boolean isMasterNode;
private Map<Class<? extends ProcessLogger>, ProcessLogger> processLoggerMap;
public ProcessLoggerService(Environment environment, Settings settings, ServiceManager serviceManager) {
super(environment, settings, serviceManager);
}
@Override
protected boolean doStart() throws FastcatSearchException {
processLoggerMap = new HashMap<Class<? extends ProcessLogger>, ProcessLogger>();
//db를 사용할지 말지 결정.
registerProcessLogger(new SearchProcessLogger());
registerProcessLogger(new IndexingProcessLogger());
nodeService = ServiceManager.getInstance().getService(NodeService.class);
isMasterNode = nodeService.isMaster();
return true;
}
@Override
protected boolean doStop() throws FastcatSearchException {
processLoggerMap.clear();
return true;
}
@Override
protected boolean doClose() throws FastcatSearchException {
processLoggerMap = null;
return true;
}
private void registerProcessLogger(ProcessLogger processLogger){
processLoggerMap.put(processLogger.getClass(), processLogger);
}
/*
* ProcessLoggerJob 에서 실제 log를 남기고자할때 logger를 받아서 사용한다.
* */
protected <T> T getProcessLogger(Class<T> processLoggerClass){
return (T) processLoggerMap.get(processLoggerClass);
}
/**
* 프로세스 로그를 남길 내용을 전달하여 호출한다.
* */
public void log(Class<? extends ProcessLogger> processLoggerClasss, ProcessLog processLog){
ProcessLoggerJob processLoggerJob = new ProcessLoggerJob(processLoggerClasss, processLog);
if(isMasterNode){
//master면 바로 실행.
ServiceManager.getInstance().getService(JobService.class).offerSequential(processLoggerJob);
}else{
//slave라면 master에게 보낸다.
nodeService.sendRequestToMaster(processLoggerJob);
}
}
}