Spring version upgrade, DownloaderImpl complete (need some tests!)

apache_commons_compress
Terekhin Alexander 5 years ago
parent 83fcb23e67
commit f2937772b4
  1. 2
      pom.xml
  2. 6
      src/main/java/me/bearns/fias/service/Downloader.java
  3. 59
      src/main/java/me/bearns/fias/service/DownloaderImpl.java
  4. 4
      src/main/java/me/bearns/fias/service/FiasUpdater.java

@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>me.bearns</groupId>

@ -1,9 +1,9 @@
package me.bearns.fias.service;
import java.io.InputStream;
import java.util.concurrent.Future;
import java.io.File;
import java.util.concurrent.CompletableFuture;
public interface Downloader {
public Future<InputStream> download(String url);
public CompletableFuture<File> download(String url);
}

@ -1,28 +1,65 @@
package me.bearns.fias.service;
import java.io.InputStream;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.springframework.stereotype.Component;
import java.io.*;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.concurrent.*;
@Component
public class DownloaderImpl implements Downloader {
private static final ExecutorService pool = Executors.newCachedThreadPool();
private static final String BASE_DIRECTORY = "/var/opt/fias";
private static final ConcurrentMap<String,CompletableFuture<File>> locks = new ConcurrentHashMap();
@Override
public Future<InputStream> download(String url) {
public CompletableFuture<File> download(String url) {
CompletableFuture<File> start = new CompletableFuture<>();
CompletableFuture<InputStream> completableFuture
= new CompletableFuture<>();
//syncronized
final CompletableFuture<File> feature = locks.putIfAbsent(url, start);
//return earlier runned feature
if(feature != start) return feature;
pool.submit(() -> {
InputStream is = null;
//todo
completableFuture.complete(is);
final URL conn;
final Path path;
try{
conn = new URL(url);
path = Paths.get(BASE_DIRECTORY, conn.getFile());
} catch (IOException e) {
feature.obtrudeException(e);
return;
}
final File file = path.toFile();
if(!file.exists()) {
try (BufferedInputStream in = new BufferedInputStream(conn.openStream())) {
Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
// handle exception
feature.obtrudeException(e);
}
}
feature.complete(file);
});
return completableFuture;
return feature;
}
}

@ -5,7 +5,7 @@ import me.bearns.fias.repository.FiasVersionRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.InputStream;
import java.io.File;
import java.util.List;
import java.util.concurrent.Future;
import java.util.stream.Stream;
@ -63,7 +63,7 @@ public class FiasUpdater implements Updater {
updates.sort((o1, o2) -> Math.toIntExact(o1.getVersionId() - o2.getVersionId()));
//just for test
final Stream<Future<InputStream>> stream = updates.stream().map(u -> downloader.download(reloadFlag ? u.getFiasCompleteXmlUrl() : u.getFiasDeltaXmlUrl()));
final Stream<Future<File>> stream = updates.stream().map(u -> downloader.download(reloadFlag ? u.getFiasCompleteXmlUrl() : u.getFiasDeltaXmlUrl()));
}

Loading…
Cancel
Save