整个项目的数据入口是监听FTP文件变化实现的。程序通过监听FTP目录内文件的变化(查找那些文件修改日期比上次修改日期晚的,然后在数据库中没有记录的文件),把监听到新增的文件信息保存在数据库表内文件队列表,然后文件校验拓扑从文件队列表获取那些需要处理的文件信息然后进行拓扑处理。
配置文件
ZOOKEEPER_HOST_PORT=10.230.16.71:2181
ZOOKEEPER_HOST=10.230.16.71
ZOOKEEPER_PORT=2181
SERIAL_VERSION=20170922
#redis IP
REDIS_HOST=10.230.16.77
REDIS_PORT=6379
#程序运行所在的机器IP
LOCAL_IP=10.230.16.77
监听程序入口
package com.lancy.main;
import java.util.List;
import java.util.Properties;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.lancy.entity.FTPEntity;
import com.lancy.thread.GlobalFTPListener;
import com.lancy.thread.LocalFTPListener;
/**
* FTPListenMain FTP监听启动类 ,通过参数控制启动不同的监听
*/
public class FTPListenMain {
private static Logger logger = LoggerFactory.getLogger(FTPListenMain.class);
private static Properties props = new Properties();
private static final String profile = "config.properties";
static {
try {
props.load(FTPListenMain.class.getResourceAsStream("/" + profile));
} catch (Exception e) {
logger.error(e.getMessage());
}
}
//根据zookeeper里初始化的ftp配置信息启动对应的主机FTP的监听程序。zookeeper每配置一个ftp的主机信息,就启动一个监听线程
public static void main(String[] args) {
String zk_Host_Port = props.getProperty("ZOOKEEPER_HOST_PORT");
String local_Ip = props.getProperty("LOCAL_IP");
String redis_Host = props.getProperty("REDIS_HOST");
int redis_Port = Integer.parseInt(props.getProperty("REDIS_PORT"));
try {
// 参数为为空 不启动
if (args == null || args.length <= 0) {
logger.info(">>>>输入参数不正确>>>为空>>>");
return;
}
ZooKeeper zooKeeper = new ZooKeeper(zk_Host_Port, 1000, null);
if (args.length == 1 && "lnt".equals(args[0])) {
List<String> listPath = zooKeeper.getChildren("/lnt/ftp", false);
//获取zookeeper路径/lnt/ftp/下的所有节点,一般是ip地址
for (String nodePath : listPath) {
//nodeData是一个json字符串
//"{'host':'10.230.16.77','port':21,'username':'lnt','password':'123456','default':0,
'inPath':'input','outPath':'output'}"
String nodeData = new String(zooKeeper.getData("/lnt/ftp" + "/" + nodePath, false, null));
JSONObject json = JSON.parseObject(nodeData);
FTPEntity ftpEntity = new FTPEntity(json);
// 开启监听线程
if (!ftpEntity.getHost().equals("10.230.16.202")) {
logger.info(">>>>>>>>>>>>>>>>>>>开启监听线程,监听:" + ftpEntity.getHost() + ">>>>>>>>>>>>>>>>>>>>");
Thread listenLocalFTP = new Thread(new LocalFTPListener(ftpEntity, local_Ip, redis_Host, redis_Port));
listenLocalFTP.start();
}
}
} else if (args.length == 1 && "ykt".equals(args[0])) {
//差不多代码
} else if (args.length == 2 && "lnt".equals(args[0]) && "ykt".equals(args[1])) {
//上面两个代码相加
} else {
logger.info(">>>>输入参数不正确>>>>>>");
return;
}
zooKeeper.close();
} catch (Exception e) {
logger.info(e.getMessage());
e.printStackTrace();
}
}
}
监听线程类
package com.lancy.thread;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.commons.net.ftp.FTPFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONObject;
import com.lancy.common.DButil;
import com.lancy.common.DateUtil;
import com.lancy.common.FTP