asynchroner Webrequest

Hallo,

ich erzeuge aus Java einen Client der einen Webrequest an einen WebService, welcher Exceldateien erstellt, sendet. Der Client sendet mittels "Post" die Daten über die "HttpURLConnection" Klasse an den WebService. Das funktioniert so weit auch gut. Nun Frage ich mich wie ich den Request aus Java "asynchron" abschicken kann. Bin im Bereich WebServices gerade erst eingestiegen und würde mich über einen Tipp freuen.

mfg

Gerald
 

DrZoidberg

Top Contributor
Du könntest auch zwei verschiedene Executors verwenden. Einen für die IO Operationen, der dann auch mehrere Threads gleichzeitig benutzen kann. Und einen zweiten, mit dem du den ganzen Rest in einem einzigen Thread laufen lässt. Denn die Verwendung von nur einem Thread vereinfacht das Ganze und vermeidet Synchronisierungsprobleme.
Hier ist mal ein Beispiel.
Ich bin in der Lage ein Objekt, das nicht Thread sicher ist, ohne Synchronisierung zu verändern, da dabei nur ein Thread im Spiel ist.
Java:
import java.util.concurrent.*;
import java.net.URL;
import java.io.*;
import java.util.*;

public class Test {
  private static ExecutorService asyncIOExecutor = Executors.newCachedThreadPool();
  private static ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

  private static CompletableFuture<String> fetchString(String urlStr) {
    CompletableFuture<String> fut = new CompletableFuture<>();
    asyncIOExecutor.execute(() -> {
      try {
        URL url = new URL(urlStr);
        StringBuilder result = new StringBuilder();
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        String line = null;
        while((line = in.readLine()) != null) {
          result.append(line);
        }
        in.close();
        fut.complete(result.toString());
      } catch(IOException e) {
        fut.completeExceptionally(e);
      }
    });
    return fut;
  }

  private static void start() {
    HashMap<String, Integer> map = new HashMap<>();
    List<String> urls = Arrays.asList("https://de.wikipedia.org/wiki/Java", "https://de.wikipedia.org/wiki/JavaScript");

    urls.forEach(url ->
      fetchString(url).whenCompleteAsync((String html, Throwable e) -> {
        if(e == null) map.put(url, html.length());
      }, singleThreadExecutor)
    );
  }

  public static void main(String[] args) {
    singleThreadExecutor.execute(Test::start);
  }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Asynchroner HTTP Client / non-blocking I/O Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben