package net.hasor.land.bootstrap;
import io.netty.util.TimerTask;
import net.hasor.core.*;
import net.hasor.core.event.StandardEventManager;
import net.hasor.land.domain.LandEvent;
import net.hasor.land.domain.ServerStatus;
import net.hasor.land.domain.WorkMode;
import net.hasor.land.election.ElectionService;
import net.hasor.rsf.InterAddress;
import net.hasor.rsf.RsfBindInfo;
import net.hasor.rsf.RsfClient;
import net.hasor.rsf.RsfContext;
import net.hasor.rsf.utils.NetworkUtils;
import net.hasor.rsf.utils.StringUtils;
import net.hasor.rsf.utils.TimerManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.URISyntaxException;
import java.net.UnknownHostException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* Created by yongchun.zyc on 2017/2/22.
*/
public class LandContext {
protected Logger logger = LoggerFactory.getLogger(getClass());
private String serverID = null; // 当前服务器ID
private Map<String, InterAddress> servers = null;
private RsfBindInfo<?> electionService = null;
private WorkMode workMode = null; //
private EventContext eventContext = null;
private TimerManager timerManager = null;
@Inject
private RsfContext rsfContext;
private InterAddress workAddress;
//
@Init
public void init() throws UnknownHostException, URISyntaxException {
//
ClassLoader classLoader = this.rsfContext.getClassLoader();
this.eventContext = new StandardEventManager(2, "Land", classLoader);
this.timerManager = new TimerManager(500, "Land", classLoader);
//
Settings settings = rsfContext.getSettings();
this.serverID = settings.getString("hasor.land.serviceID", "local");
this.workMode = settings.getEnum("hasor.land.workAt", WorkMode.class, WorkMode.None);
//
// .基础属性初始化
if ("local".equalsIgnoreCase(this.serverID)) {
this.serverID = NetworkUtils.finalBindAddress(this.serverID).getHostAddress();
}
//
String protocol = this.rsfContext.getDefaultProtocol();
this.workAddress = this.rsfContext.publishAddress(protocol);
//
// .集群信息
this.servers = new HashMap<String, InterAddress>();
String services = settings.getString("hasor.land.servers");
if (StringUtils.isNotBlank(services)) {
String[] serverArrays = services.split(",");
for (String serverInfo : serverArrays) {
serverInfo = serverInfo.trim();
String[] infos = serverInfo.split(":");
if (infos.length != 3) {
continue;
}
String serverID = serverInfo.substring(0, infos[0].length());
String serverTarget = serverInfo.substring(serverID.length() + 1);
servers.put(serverID, new InterAddress("rsf://" + serverTarget + "/default"));
}
}
// .选举服务
this.electionService = this.rsfContext.getServiceInfo(ElectionService.class);
}
//
//
//
/** 当前服务器ID */
public String getServerID() {
return serverID;
}
/** 所有服务器ID */
public Collection<String> getServerIDs() {
return this.servers.keySet();
}
/** 选举服务元信息 */
public RsfBindInfo<?> getElectionService() {
return this.electionService;
}
//
//
//
public void addStatusListener(EventListener<?> listener) {
this.eventContext.addListener(LandEvent.ServerStatus, listener);
}
public void addVotedListener(EventListener<?> listener) {
this.eventContext.addListener(LandEvent.VotedFor_Event, listener);
}
/** 定时器 */
public void atTime(TimerTask timerTask, int timeout) {
this.timerManager.atTime(timerTask, timeout);
}
//
//
//
public RsfClient wrapperApi(String serverID) {
InterAddress interAddress = this.servers.get(serverID);
return this.rsfContext.getRsfClient(interAddress);
}
/** 进行投票 */
public void fireVotedFor(String votedTo) {
try {
this.eventContext.fireSyncEvent(LandEvent.VotedFor_Event, votedTo);
} catch (Throwable e) {
logger.error(e.getMessage(), e);
}
}
/** 服务器状态变化 */
public void fireStatus(ServerStatus toStatus) {
try {
this.eventContext.fireSyncEvent(LandEvent.ServerStatus, toStatus);
} catch (Throwable e) {
logger.error(e.getMessage(), e);
}
}
}