StructuredExecutor Incompatible with HttpClient?
    Eric Kolotyluk 
    eric at kolotyluk.net
       
    Sun Nov 28 19:19:20 UTC 2021
    
    
  
package net.kolotyluk.loom;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.URI;
public class Experiment20_HttpClient {
    public static void main2(String args[]) {
        Context.printHeader(Experiment20_HttpClient.class);
        var virtualThreadFactory  = Thread.ofVirtual().factory();
        try (var executorService =
Executors.newThreadPerTaskExecutor(virtualThreadFactory)) {
            // https://apipheny.io/free-api/
            var client = HttpClient.newBuilder()
                    .executor(executorService)
                    .connectTimeout(Duration.ofSeconds(10))
                    .build();
            var request = HttpRequest.newBuilder()
                    .uri(URI.create("https://www.boredapi.com/api/activity"))
                    .build();
            Callable<String> getActivity = () -> {
                var response = client.sendAsync(request,
HttpResponse.BodyHandlers.ofString())
                        .thenApply(HttpResponse::body)
                        .join();
                System.out.printf("early result = %s\n", response);
                return response;
            };
            var result1 = executorService.submit(getActivity);
            System.out.printf("result1 = %s", result1.get());
        }
        catch (ExecutionException e) {
            e.printStackTrace();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public static void main(String args[]) {
        Context.printHeader(Experiment20_HttpClient.class);
        try (var structuredExecutor = StructuredExecutor.open("Experiment20")) {
            // https://apipheny.io/free-api/
            var client = HttpClient.newBuilder()
                    .executor(structuredExecutor)
                    .connectTimeout(Duration.ofSeconds(10))
                    .build();
            var request = HttpRequest.newBuilder()
                    .uri(URI.create("https://www.boredapi.com/api/activity"))
                    .build();
            Callable<String> getActivity = () -> {
                var response = client.sendAsync(request,
HttpResponse.BodyHandlers.ofString())
                        .thenApply(HttpResponse::body)
                        .join();
                System.out.printf("early result = %s\n", response);
                return response;
            };
            var result1 = structuredExecutor.fork(getActivity);
            try {
                structuredExecutor.joinUntil(Instant.now().plusSeconds(10));
            }
            catch (TimeoutException e) {
                System.out.println("TimeoutException");
                structuredExecutor.shutdown();
                // structuredExecutor.join();
                System.out.printf("result = %s", result1.resultNow());
            }
            System.out.printf("result1 = %s", result1.get());
        }
        catch (ExecutionException e) {
            e.printStackTrace();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
So, main2 seems to work as expected, but main does not
Hello net.kolotyluk.loom.Experiment20_HttpClient
PID       = 35712
CPU Cores = 12
Heap Size = 6442450944 bytes
______________________________________________________________________________
TimeoutException
Process finished with exit code 130
It hangs indefinitely after TimeoutException, and I have to manually kill
it. The correct output should be
Hello net.kolotyluk.loom.Experiment20_HttpClient
PID       = 3480
CPU Cores = 12
Heap Size = 6442450944 bytes
______________________________________________________________________________
early result = {"activity":"Clean out your closet and donate the clothes
you've
outgrown","type":"charity","participants":1,"price":0,"link":"","key":"9026787","accessibility":0.1}
result1 = {"activity":"Clean out your closet and donate the clothes you've
outgrown","type":"charity","participants":1,"price":0,"link":"","key":"9026787","accessibility":0.1}
Process finished with exit code 0
Cheers, Eric
    
    
More information about the loom-dev
mailing list