package com.vip.saturn.job.sharding.listener;
import com.vip.saturn.job.sharding.service.ExecutorCleanService;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent.Type;
import com.vip.saturn.job.sharding.node.SaturnExecutorsNode;
import com.vip.saturn.job.sharding.service.NamespaceShardingService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author chembo.huang
*
*/
public class ExecutorOnlineOfflineTriggerShardingListener extends AbstractTreeCacheListener {
private static final Logger logger = LoggerFactory.getLogger(ExecutorOnlineOfflineTriggerShardingListener.class);
private NamespaceShardingService namespaceShardingService;
private ExecutorCleanService executorCleanService;
public ExecutorOnlineOfflineTriggerShardingListener(NamespaceShardingService namespaceShardingService, ExecutorCleanService executorCleanService) {
this.namespaceShardingService = namespaceShardingService;
this.executorCleanService = executorCleanService;
}
@Override
public void childEvent(Type type, String path, String nodeData) throws Exception {
if(isExecutorOnline(type, path)) {
String executorName = SaturnExecutorsNode.getExecutorNameByIpPath(path);
namespaceShardingService.asyncShardingWhenExecutorOnline(executorName, nodeData);
} else if(isExecutorOffline(type, path)) {
String executorName = SaturnExecutorsNode.getExecutorNameByIpPath(path);
try {
executorCleanService.clean(executorName);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
try {
namespaceShardingService.asyncShardingWhenExecutorOffline(executorName);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}
private boolean isExecutorOnline(TreeCacheEvent.Type type, String path) {
return type == TreeCacheEvent.Type.NODE_ADDED && path.matches(SaturnExecutorsNode.EXECUTOR_IPNODE_PATH_REGEX);
}
public boolean isExecutorOffline(TreeCacheEvent.Type type, String path) {
return type == TreeCacheEvent.Type.NODE_REMOVED && path.matches(SaturnExecutorsNode.EXECUTOR_IPNODE_PATH_REGEX);
}
}