ea-async icon indicating copy to clipboard operation
ea-async copied to clipboard

Says "the method invoking await must return a CompletableFuture" but it does already

Open DidierLoiseau opened this issue 7 years ago • 4 comments

If you forget to instrument the code, the wrong warning message is printed:

WARN com.ea.async.Async - Warning: Illegal call to await, the method invoking await must return a CompletableFuture

instead of

Warning: Illegal call to await, static { Async.init(); } must be added to the main program class and the method invoking await must return a CompletableFuture

As shown by the following simple example:

import java.util.concurrent.CompletableFuture;

import com.ea.async.Async;

public class EAsyncTest {

	static CompletableFuture<String> convert(CompletableFuture<?> future) {
		Object result = Async.await(future);
		return CompletableFuture.completedFuture(result.toString());
	}

	public static void main(String[] args) {
		convert(new CompletableFuture<>());
	}
}

This is because calling InitializeAsync.isRunning() triggers the class initialization, and only enters that method once isRunning = true. The only ways to have isRunning() returning false is if either the initialization crashes or if called from multiple threads.

In addition, I think it would be better to throw an exception than calling join(). In the above example this causes a deadlock, and you don't know which method it is referring to.

DidierLoiseau avatar Mar 08 '19 15:03 DidierLoiseau

It also seems like if you have instrumented your code it will always give:

WARN com.ea.async.Async - Warning: Illegal call to await, the method invoking await must return a CompletableFuture

I am not sure if the else part should have been something like below instead

        if (!InitializeAsync.isRunning()) {
            warning = "Warning: Illegal call to await, static { Async.init(); } must be added to the main program class and the method invoking await must return a CompletableFuture";
        } else if (!(future instanceof CompletableFuture)) {
            warning = "Warning: Illegal call to await, the method invoking await must return a CompletableFuture";
        }

TryingToImprove avatar Nov 05 '19 10:11 TryingToImprove

@TryingToImprove if you have properly instrumented your code, the call to await() is removed, so you shouldn't get a warning.

DidierLoiseau avatar Dec 01 '19 11:12 DidierLoiseau

Getting this warning, too, despite initialized directly in the main method with Await.init().

spyro2000 avatar Dec 12 '19 18:12 spyro2000

I am seeing this, too, even while my code (under test) runs as expected. Would a reproducer be helpful?

jpines-vi avatar Sep 06 '22 20:09 jpines-vi