All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.luhuiguo.fastdfs.domain.TrackerLocator Maven / Gradle / Ivy

The newest version!
package com.luhuiguo.fastdfs.domain;

import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;

import com.luhuiguo.fastdfs.exception.FdfsUnavailableException;

/**
 * 表示Tracker服务器位置
 * 
 * 
 * 支持负载均衡对IP轮询
 * 
* * @author tobato * */ public class TrackerLocator { /** 10分钟以后重试连接 */ private static final int DEFAULT_RETRY_AFTER_SECEND = 10 * 60; /** tracker服务配置地址列表 */ private List trackerList = new ArrayList(); /** 目录服务地址-为了加速处理,增加了一个map */ private Map trackerAddressMap = new HashMap(); /** 轮询圈 */ private CircularList trackerAddressCircular = new CircularList(); /** 连接中断以后经过N秒重试 */ private int retryAfterSecend = DEFAULT_RETRY_AFTER_SECEND; /** * 初始化Tracker服务器地址 * 配置方式为 ip:port 如 192.168.1.2:21000 * * @param trackerList */ public TrackerLocator(List trackerList) { super(); this.trackerList = trackerList; buildTrackerAddresses(); } /** * 分析TrackerAddress */ private void buildTrackerAddresses() { Set addressSet = new HashSet(); for (String item : trackerList) { if (StringUtils.isBlank(item)) { continue; } String[] parts = StringUtils.split(item, ":", 2); if (parts.length != 2) { throw new IllegalArgumentException( "the value of item \"tracker_server\" is invalid, the correct format is host:port"); } InetSocketAddress address = new InetSocketAddress(parts[0].trim(), Integer.parseInt(parts[1].trim())); addressSet.add(address); } // 放到轮询圈 for (InetSocketAddress item : addressSet) { TrackerAddressHolder holder = new TrackerAddressHolder(item); trackerAddressCircular.add(holder); trackerAddressMap.put(item, holder); } } public void setTrackerList(List trackerList) { this.trackerList = trackerList; } public void setRetryAfterSecend(int retryAfterSecend) { this.retryAfterSecend = retryAfterSecend; } /** * 获取Tracker服务器地址 * * @return */ public InetSocketAddress getTrackerAddress() { TrackerAddressHolder holder; // 遍历连接地址,抓取当前有效的地址 for (int i = 0; i < trackerAddressCircular.size(); i++) { holder = trackerAddressCircular.next(); if (holder.canTryToConnect(retryAfterSecend)) { return holder.getAddress(); } } throw new FdfsUnavailableException("找不到可用的tracker " + getTrackerAddressConfigString()); } /** * 获取配置地址列表 * * @return */ private String getTrackerAddressConfigString() { StringBuffer config = new StringBuffer(); for (int i = 0; i < trackerAddressCircular.size(); i++) { TrackerAddressHolder holder = trackerAddressCircular.next(); InetSocketAddress address = holder.getAddress(); config.append(address.toString()).append(","); } return new String(config); } /** * 设置连接有效 * * @param address */ public void setActive(InetSocketAddress address) { TrackerAddressHolder holder = trackerAddressMap.get(address); holder.setActive(); } /** * 设置连接无效 * * @param address */ public void setInActive(InetSocketAddress address) { TrackerAddressHolder holder = trackerAddressMap.get(address); holder.setInActive(); } public List getTrackerList() { return Collections.unmodifiableList(trackerList); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy