com.github.ltsopensource.spring.TaskTrackerXmlFactoryBean Maven / Gradle / Ivy
The newest version!
package com.github.ltsopensource.spring;
import com.github.ltsopensource.autoconfigure.PropertiesConfigurationFactory;
import com.github.ltsopensource.core.commons.utils.CollectionUtils;
import com.github.ltsopensource.core.commons.utils.StringUtils;
import com.github.ltsopensource.core.constant.Level;
import com.github.ltsopensource.core.listener.MasterChangeListener;
import com.github.ltsopensource.tasktracker.TaskTracker;
import com.github.ltsopensource.tasktracker.TaskTrackerBuilder;
import com.github.ltsopensource.core.properties.TaskTrackerProperties;
import com.github.ltsopensource.tasktracker.runner.JobRunner;
import com.github.ltsopensource.tasktracker.runner.RunnerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import java.util.Properties;
/**
* TaskTracker Spring Bean 工厂类
* 如果用这个工厂类,那么JobRunner中引用SpringBean的话,只有通过xml的方式注入
*
* @author Robert HG ([email protected]) on 8/4/15.
*/
public abstract class TaskTrackerXmlFactoryBean implements FactoryBean,
InitializingBean, DisposableBean {
private TaskTracker taskTracker;
private boolean started;
/**
* 集群名称
*/
private String clusterName;
/**
* 节点组名称
*/
private String nodeGroup;
/**
* zookeeper地址
*/
private String registryAddress;
/**
* 提交失败任务存储路径 , 默认用户木邻居
*/
private String dataPath;
private String identity;
private String bindIp;
/**
* 工作线程个数
*/
private int workThreads;
/**
* 业务日志级别
*/
private Level bizLoggerLevel;
/**
* master节点变化监听器
*/
private MasterChangeListener[] masterChangeListeners;
/**
* 额外参数配置
*/
private Properties configs = new Properties();
private String[] locations;
@Override
public TaskTracker getObject() throws Exception {
return taskTracker;
}
@Override
public Class> getObjectType() {
return TaskTracker.class;
}
@Override
public boolean isSingleton() {
return true;
}
@Override
public void afterPropertiesSet() throws Exception {
TaskTrackerProperties properties = null;
if (locations == null || locations.length == 0) {
properties = new TaskTrackerProperties();
properties.setClusterName(clusterName);
properties.setDataPath(dataPath);
properties.setNodeGroup(nodeGroup);
properties.setRegistryAddress(registryAddress);
properties.setBindIp(bindIp);
properties.setIdentity(identity);
properties.setBizLoggerLevel(bizLoggerLevel);
properties.setWorkThreads(workThreads);
properties.setConfigs(CollectionUtils.toMap(configs));
} else {
properties = PropertiesConfigurationFactory.createPropertiesConfiguration(TaskTrackerProperties.class, locations);
}
taskTracker = TaskTrackerBuilder.buildByProperties(properties);
taskTracker.setRunnerFactory(new RunnerFactory() {
@Override
public JobRunner newRunner() {
return createJobRunner();
}
});
if (masterChangeListeners != null) {
for (MasterChangeListener masterChangeListener : masterChangeListeners) {
taskTracker.addMasterChangeListener(masterChangeListener);
}
}
}
/**
* 可以自己得到TaskTracker对象后调用,也可以直接使用spring配置中的init属性指定该方法
*/
public void start() {
if (!started) {
taskTracker.start();
started = true;
}
}
protected abstract JobRunner createJobRunner();
@Override
public void destroy() throws Exception {
taskTracker.stop();
}
public void setClusterName(String clusterName) {
this.clusterName = clusterName;
}
public void setNodeGroup(String nodeGroup) {
this.nodeGroup = nodeGroup;
}
public void setRegistryAddress(String registryAddress) {
this.registryAddress = registryAddress;
}
public void setDataPath(String dataPath) {
this.dataPath = dataPath;
}
public void setWorkThreads(int workThreads) {
this.workThreads = workThreads;
}
public void setMasterChangeListeners(MasterChangeListener... masterChangeListeners) {
this.masterChangeListeners = masterChangeListeners;
}
public void setBizLoggerLevel(String bizLoggerLevel) {
if (StringUtils.isNotEmpty(bizLoggerLevel)) {
this.bizLoggerLevel = Level.valueOf(bizLoggerLevel);
}
}
public void setConfigs(Properties configs) {
this.configs = configs;
}
public void setBindIp(String bindIp) {
this.bindIp = bindIp;
}
public void setIdentity(String identity) {
this.identity = identity;
}
public void setLocations(String... locations) {
this.locations = locations;
}
}