# asynchroner Webrequest



## GeraldVonRiva (15. Jul 2016)

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


----------



## tommysenf (17. Jul 2016)

Entweder ganz klassisch über einen neuen Thread, oder etwas moderner mittels Executer, Callable und Future.


----------



## GeraldVonRiva (18. Jul 2016)

Hallo,

Danke für den Tipp schicke den Webrequest in einem neuen Thread ab. Werde mir aber mal die moderneren Mechanismen anschauen.

Grüße
Gerald


----------



## BRoll (18. Jul 2016)

Hi, wenn du das "richtig" machen willst, schau dir am besten mal eine geeignete Technologie dafür an z.B. http://reactivex.io/


----------



## DrZoidberg (19. Jul 2016)

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.

```
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);
  }
}
```


----------

