Java实现定时从远程服务器下载文件(Redis消息队列)

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;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值