use of com.creditease.uav.feature.runtimenotify.RuntimeNotifySliceMgr in project uavstack by uavorg.
the class JudgeNotifyTask method run.
@Override
public void run() {
NotifyStrategy stra = null;
try {
/**
* Step 1: seek strategy
*/
RuntimeNotifyStrategyMgr strategyMgr = (RuntimeNotifyStrategyMgr) getConfigManager().getComponent(this.feature, "RuntimeNotifyStrategyMgr");
stra = strategyMgr.seekStrategy(curSlice.getKey());
if (stra == null) {
return;
}
/**
* Step 1.5: underclocking
*/
long range = stra.getMaxRange();
if (range > 0) {
CacheManager cm = (CacheManager) getConfigManager().getComponent(this.feature, STORAGE_CACHE_MANAGER_NAME);
String judgedKey = genJudgedKey(curSlice);
if (cm.exists(UAV_CACHE_REGION, judgedKey)) {
return;
} else {
cm.put(UAV_CACHE_REGION, judgedKey, String.valueOf(curSlice.getTime()));
cm.expire(UAV_CACHE_REGION, judgedKey, range, TimeUnit.MILLISECONDS);
}
}
/**
* Step 2: dump range slices
*/
List<Slice> rangeSlices = null;
if (range > 0) {
RuntimeNotifySliceMgr sliceMgr = (RuntimeNotifySliceMgr) getConfigManager().getComponent(this.feature, "RuntimeNotifySliceMgr");
rangeSlices = sliceMgr.getSlices(curSlice, range);
if (rangeSlices.isEmpty()) {
if (log.isDebugEnable()) {
log.debug(this, "RuntimeNotify judge dump invalid.");
}
return;
}
} else {
rangeSlices = new ArrayList<>(1);
rangeSlices.add(curSlice);
}
/**
* Step 3: judge the strategy
*/
StrategyJudgement judgement = (StrategyJudgement) getConfigManager().getComponent(feature, "StrategyJudgement");
Map<String, String> result = judgement.judge(curSlice, stra, rangeSlices);
// ?? maybe no effective
if (rangeSlices != null) {
rangeSlices.clear();
rangeSlices = null;
}
/**
* Step 5: if fire the event, build notification event
*/
if (result != null && !result.isEmpty()) {
NotificationEvent event = this.newNotificationEvent(result, stra.getConvergences());
// get context
putContext(event);
// get action
putNotifyAction(event, stra);
// get msg tempalte
putNotifyMsg(event, stra);
if (this.log.isTraceEnable()) {
this.log.info(this, "RuntimeNotify Notification Event Happen: event=" + event.toJSONString());
}
this.putNotificationEvent(event);
}
} catch (Exception e) {
log.err(this, "JudgeNotifyTask RUN FAIL.", e);
}
if (log.isDebugEnable()) {
long cost = System.currentTimeMillis() - taskStart;
String detail = cost < 10 ? "" : " detail: key=" + curSlice.getKey() + ", strategy=" + JSONHelper.toString(stra);
log.debug(this, "whole task lifecycle COST: (" + cost + ")ms" + detail);
}
}
use of com.creditease.uav.feature.runtimenotify.RuntimeNotifySliceMgr in project uavstack by uavorg.
the class RuntimeNotifyCatcher method start.
@Override
public void start() {
// reset aredis bootstrap executor pool size
AsyncRedisConnection.setBootstrapExecutorPoolSize(getCfgInt("cm.bootstrappoolsize", 10));
// init cache manager
String cacheServer = getCfg("cm.server");
int cmMinSize = getCfgInt("cm.minsize", 5);
int cmMaxSize = getCfgInt("cm.maxsize", 10);
int cmQueueSize = getCfgInt("cm.qsize", 5);
String cmPwd = getCfg("cm.pwd");
CacheManager cm = CacheManagerFactory.build(cacheServer, cmMinSize, cmMaxSize, cmQueueSize, cmPwd);
getConfigManager().registerComponent(this.feature, CACHE_MANAGER_NAME, cm);
if (log.isTraceEnable()) {
log.info(this, String.format("RuntimeNotifyCatcher-CacheManager INIT: server:%s,minsize:%d,maxsize:%d,qsize:%d", cacheServer, cmMinSize, cmMaxSize, cmQueueSize));
}
// init slice storage cm
String storeCMServer = getCfg("storecm.server");
int storeCMMinSize = getCfgInt("storecm.minsize", 5);
int storeCMMaxSize = getCfgInt("storecm.maxsize", 10);
int storeCMQueueSize = getCfgInt("storecm.qsize", 5);
String storeCMPwd = getCfg("storecm.pwd");
CacheManager storeCM = CacheManagerFactory.build(storeCMServer, storeCMMinSize, storeCMMaxSize, storeCMQueueSize, storeCMPwd);
getConfigManager().registerComponent(this.feature, STORAGE_CACHE_MANAGER_NAME, storeCM);
if (log.isTraceEnable()) {
log.info(this, String.format("RuntimeNotifyCatcher-StorageCacheManager INIT: server:%s,minsize:%d,maxsize:%d,qsize:%d", storeCMServer, storeCMMinSize, storeCMMaxSize, storeCMQueueSize));
}
new StrategyJudgement("StrategyJudgement", this.feature);
// init strategyMgr
String strategy = getCfg("strategy.config");
RuntimeNotifyStrategyMgr rtNotifyStrategyMgr = new RuntimeNotifyStrategyMgr("RuntimeNotifyStrategyMgr", feature, cm);
/**
* NOTE: this setting is only for development testing for production env, the strategy is only read from cache
*/
if (strategy != null) {
rtNotifyStrategyMgr.loadStrategy(strategy);
}
long strategyPeriod = DataConvertHelper.toLong(this.getConfigManager().getFeatureConfiguration(this.feature, "strategy.interval"), 30000);
this.getTimerWorkManager().scheduleWork("RuntimeNotifyStrategyMgr", rtNotifyStrategyMgr, 0, strategyPeriod);
if (log.isTraceEnable()) {
log.info(this, "RuntimeNotifyCatcher-RuntimeNotifyStrategyMgr started: " + strategy);
}
// init SliceMgr
String sliceConfig = getCfg("slice.config");
RuntimeNotifySliceMgr sliceMgr = new RuntimeNotifySliceMgr("RuntimeNotifySliceMgr", feature, storeCM);
sliceMgr.loadSliceConfig(sliceConfig);
if (log.isTraceEnable()) {
log.info(this, "RuntimeNotifyCatcher-RuntimeNotifySliceMgr started: " + sliceConfig);
}
// init 1+N qworker
int coreSize = getCfgInt("qworker.coresize", 5);
int maxSize = getCfgInt("qworker.maxsize", 50);
int bqSize = getCfgInt("qworker.bqsize", 20);
int timeout = getCfgInt("qworker.keepalivetimeout", 60000);
I1NQueueWorker runtimeNotifyJudgeWorker = get1NQueueWorkerMgr().newQueueWorker(QWORKER_NAME, feature, coreSize, maxSize, bqSize, timeout);
qwThread = new Thread(runtimeNotifyJudgeWorker);
qwThread.setName("RuntimeNotifyCatcher-I1NQueueWorker-MainThread");
qwThread.start();
if (log.isTraceEnable()) {
log.info(this, String.format("RuntimeNotifyCatcher-I1NQueueWorker[" + QWORKER_NAME + "] started: coresize:%d,maxsize:%d,bqsize:%d,keepalivetimeout:%d", coreSize, maxSize, bqSize, timeout));
}
// start runtime notify data consumer
StandardMessagingBuilder smb = new StandardMessagingBuilder("RTNTFCommonMsgBuilder", this.feature);
try {
smb.init("com.creditease.uav.feature.runtimenotify.messaging.handlers");
} catch (IOException e) {
log.err(this, "Read msgtype2topic.properties FAILs, RuntimeNotifyCatcher can not START", e);
return;
}
runtimeDataConsumer = smb.buildConsumer(MonitorDataFrame.MessageType.RuntimeNtf.toString());
if (runtimeDataConsumer != null) {
runtimeDataConsumer.start();
this.getConfigManager().registerComponent(this.feature, COMSUMER_RUNTIME, runtimeDataConsumer);
if (log.isTraceEnable()) {
log.info(this, "RuntimeNotifyCacher RuntimeConsumer started");
}
}
// init timer worker
boolean isEnableInfoTimer = DataConvertHelper.toBoolean(this.getCfg("nodeinfotimer.enable"), false);
if (isEnableInfoTimer == true) {
int period = getCfgInt("nodeinfotimer.period", 15000);
getTimerWorkManager().scheduleWorkInPeriod("NodeInfoWatcher", new NodeInfoWatcher("NodeInfoWatcher", feature), 0, period);
if (log.isTraceEnable()) {
log.info(this, "RuntimeNotifyCatcher-NodeInfoWatcher started: period:" + period);
}
}
// init RuntimeNotifyServerWorker
int port = Integer.parseInt(this.getConfigManager().getFeatureConfiguration(this.feature, "http.port"));
int backlog = Integer.parseInt(this.getConfigManager().getFeatureConfiguration(this.feature, "http.backlog"));
int core = Integer.parseInt(this.getConfigManager().getFeatureConfiguration(this.feature, "http.core"));
int max = Integer.parseInt(this.getConfigManager().getFeatureConfiguration(this.feature, "http.max"));
int bqsize = Integer.parseInt(this.getConfigManager().getFeatureConfiguration(this.feature, "http.bqsize"));
runtimeNotifyServerWorker = new RuntimeNotifyServerWorker("RuntimeNotifyServerWorker", feature, "rnswhandlers");
@SuppressWarnings({ "rawtypes", "unchecked" }) ThreadPoolExecutor exe = new ThreadPoolExecutor(core, max, 30000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(bqsize));
runtimeNotifyServerWorker.start(exe, port, backlog);
if (log.isTraceEnable()) {
log.info(this, "RuntimeNotifyCatcher-RuntimeNotifyServerWorker started");
}
// init RuntimeNotifyTimerWorker
if (DataConvertHelper.toBoolean(this.getCfg("timernotify.enable"), false)) {
TimerNotifyWorker timerNotifyWorker = new TimerNotifyWorker("TimerNotifyWorker", feature);
this.getTimerWorkManager().scheduleWork("TimerNotifyWorker", timerNotifyWorker, 0, 60000);
if (log.isTraceEnable()) {
log.info(this, "RuntimeNotifyCatcher-RuntimeNotifyStrategyMgr started: " + strategy);
}
}
}
use of com.creditease.uav.feature.runtimenotify.RuntimeNotifySliceMgr in project uavstack by uavorg.
the class RuntimeNotifyCatcher method pushToSliceQueue.
private void pushToSliceQueue(MonitorDataFrame mdf, boolean needConcurrent) {
long now = System.currentTimeMillis();
if (now - mdf.getTimeFlag() > DROP_TIMEOUT) {
if (log.isDebugEnable()) {
log.debug(this, "MDF too late, drop it: " + mdf.toJSONString());
}
return;
}
// step 1: store slices
List<Slice> slices = extractSlice(mdf);
RuntimeNotifySliceMgr rnsm = (RuntimeNotifySliceMgr) ConfigurationManager.getInstance().getComponent(this.feature, "RuntimeNotifySliceMgr");
rnsm.storeSlices(slices, mdf.getTag());
if (log.isDebugEnable()) {
log.debug(this, "Prepare Slices for Judge: count= " + slices.size());
}
// step 2: notification judge
if (needConcurrent == false) {
// one thread judge
for (Slice slice : slices) {
new JudgeNotifyTask(JudgeNotifyTask.class.getSimpleName(), "runtimenotify", slice).run();
}
} else {
// 1+N Queue Judge
I1NQueueWorker n1nqw = get1NQueueWorkerMgr().getQueueWorker(this.feature, RuntimeNotifyCatcher.QWORKER_NAME);
for (Slice slice : slices) {
n1nqw.put(new JudgeNotifyTask(JudgeNotifyTask.class.getSimpleName(), feature, slice));
}
}
}
Aggregations