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> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version> <version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository --> <relativePath/> <!-- lookup parent from repository -->
</parent> </parent>
<groupId>me.bearns</groupId> <groupId>me.bearns</groupId>

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

@ -1,28 +1,65 @@
package me.bearns.fias.service; package me.bearns.fias.service;
import java.io.InputStream; import org.springframework.stereotype.Component;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
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 { public class DownloaderImpl implements Downloader {
private static final ExecutorService pool = Executors.newCachedThreadPool(); 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 @Override
public Future<InputStream> download(String url) { public CompletableFuture<File> download(String url) {
CompletableFuture<File> start = new CompletableFuture<>();
//syncronized
final CompletableFuture<File> feature = locks.putIfAbsent(url, start);
CompletableFuture<InputStream> completableFuture //return earlier runned feature
= new CompletableFuture<>(); if(feature != start) return feature;
pool.submit(() -> { pool.submit(() -> {
InputStream is = null;
//todo //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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.InputStream; import java.io.File;
import java.util.List; import java.util.List;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -63,7 +63,7 @@ public class FiasUpdater implements Updater {
updates.sort((o1, o2) -> Math.toIntExact(o1.getVersionId() - o2.getVersionId())); updates.sort((o1, o2) -> Math.toIntExact(o1.getVersionId() - o2.getVersionId()));
//just for test //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