| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | package com.xxl.job.admin.core.thread;import com.xxl.job.admin.core.conf.XxlJobAdminConfig;import com.xxl.job.admin.core.model.XxlJobGroup;import com.xxl.job.admin.core.model.XxlJobRegistry;import com.xxl.job.core.enums.RegistryConfig;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.*;import java.util.concurrent.TimeUnit;/** * job registry instance * @author xuxueli 2016-10-02 19:10:24 */public class JobRegistryMonitorHelper {	private static Logger logger = LoggerFactory.getLogger(JobRegistryMonitorHelper.class);	private static JobRegistryMonitorHelper instance = new JobRegistryMonitorHelper();	public static JobRegistryMonitorHelper getInstance(){		return instance;	}	private Thread registryThread;	private volatile boolean toStop = false;	public void start(){		registryThread = new Thread(new Runnable() {			@Override			public void run() {				while (!toStop) {					try {						// auto registry group						List<XxlJobGroup> groupList = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().findByAddressType(0);						if (groupList!=null && !groupList.isEmpty()) {							// remove dead address (admin/executor)							List<Integer> ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date());							if (ids!=null && ids.size()>0) {								XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids);							}							// fresh online address (admin/executor)							HashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();							List<XxlJobRegistry> list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT, new Date());							if (list != null) {								for (XxlJobRegistry item: list) {									if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {										String appname = item.getRegistryKey();										List<String> registryList = appAddressMap.get(appname);										if (registryList == null) {											registryList = new ArrayList<String>();										}										if (!registryList.contains(item.getRegistryValue())) {											registryList.add(item.getRegistryValue());										}										appAddressMap.put(appname, registryList);									}								}							}							// fresh group address							for (XxlJobGroup group: groupList) {								List<String> registryList = appAddressMap.get(group.getAppname());								String addressListStr = null;								if (registryList!=null && !registryList.isEmpty()) {									Collections.sort(registryList);									addressListStr = "";									for (String item:registryList) {										addressListStr += item + ",";									}									addressListStr = addressListStr.substring(0, addressListStr.length()-1);								}								group.setAddressList(addressListStr);								XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().update(group);							}						}					} catch (Exception e) {						if (!toStop) {							logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}", e);						}					}					try {						TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT);					} catch (InterruptedException e) {						if (!toStop) {							logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}", e);						}					}				}				logger.info(">>>>>>>>>>> xxl-job, job registry monitor thread stop");			}		});		registryThread.setDaemon(true);		registryThread.setName("xxl-job, admin JobRegistryMonitorHelper");		registryThread.start();	}	public void toStop(){		toStop = true;		// interrupt and wait		registryThread.interrupt();		try {			registryThread.join();		} catch (InterruptedException e) {			logger.error(e.getMessage(), e);		}	}}
 |