1.需求
- 获取Redis队列中的文件名称
- 更新远程服务器上的资源到本地(Https)
- 定时刷新,一但那边的服务器上传文件,就下载
2.从Redis中获取文件名称(此时的Redis相当于一个消息队列)
/**
* @Author Ragty
* @Description 定时程序(每十秒请求一次)
* @Date 15:05 2019/3/19
**/
@Scheduled(fixedDelay = 10*1000)
public void test() throws Exception {
ListOperations los = redisTemplate.opsForList();
List<String> list = los.range(reidsPath,0,-1);
if (list.size() > 0) {
for (String fileUrl : list) {
System.out.println("Download File ...");
fileUrl = los.leftPop(reidsPath).toString().replaceAll(" ","");
down(fileUrl);
}
} else {
System.out.println("Waiting ...");
}
}
3.从远程地址下载文件资源(Htpps)
/**
* @Author Ragty
* @Description 下载文件(https)
* @Date 17:25 2019/3/19
**/
public void down(String fileUrl) throws Exception{
String fileLocal = fileUrl.split(spiltPath)[1];
String[] array = fileLocal.split("/");
String folder = rootPath + fileLocal.split(array[array.length-1])[0].trim();
File file = new File(folder);
if (!file.exists()){
file.mkdirs();
}
X509TrustManager x509m = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
};
SSLContext sslcontext = SSLContext.getInstance("SSL", "SunJSSE");
sslcontext.init(null, new TrustManager[] {x509m}, new java.security.SecureRandom());
URL url = new URL(fileUrl);
HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() {
public boolean verify(String s, SSLSession sslsession) {
System.out.println("WARNING: Hostname is not matched for cert.");
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory());
HttpsURLConnection urlCon = (HttpsURLConnection) url.openConnection();
urlCon.setConnectTimeout(6000);
urlCon.setReadTimeout(6000);
int code = urlCon.getResponseCode();
if (code != HttpURLConnection.HTTP_OK) {
throw new Exception("文件读取失败");
}
// 读文件流
DataInputStream in = new DataInputStream(urlCon.getInputStream());
DataOutputStream out = new DataOutputStream(new FileOutputStream(fileLocal));
byte[] buffer = new byte[2048];
int count = 0;
while ((count = in.read(buffer)) > 0) {
out.write(buffer, 0, count);
}
out.close();
in.close();
}
4.注意事项
本文中的定时程序需要在启动类里开启定时调度(否则无法定时执行)
@EnableScheduling
本文中的变量从配置文件里获取(下面给出文中定义的变量)
@Autowired
private RedisTemplate redisTemplate;
@Value("${redis.path}")
private String reidsPath;
@Value("${download.file.spiltPath}")
private String spiltPath;
@Value("${download.file.rootPath}")
private String rootPath;