user11341081
user11341081

Reputation: 209

Is it possible to timeout java method?

I need to execute a ping webservice to check if I have connection to the endpoint and the webservice server is all fine.

It's kinda dumb but I have to call a webservice for this. The problem is that when I call the stub.ping(request) and I dont have connection it keeps trying to execute this code for like a minute... and then returns false.

Any way to make this timeout after 1 second if it cannot ping?

public boolean ping() {
        try {
            PingServiceStub stub = new PingServiceStub(soapGWEndpoint);
            ReqPing request = new ReqPing();

            UserInfo userInfo = new UserInfo();
            userInfo.setName(soapGWUser);
            userInfo.setPassword(soapGWPassword);
            ApplicationInfo applicationInfo = new ApplicationInfo();
            applicationInfo.setConfigurationName(soapGWAppName);

            stub.ping(request);

            return true;
        } catch (RemoteException | PingFault e) {
            return false;
        }
    }

Upvotes: 6

Views: 1984

Answers (2)

Michał Krzywański
Michał Krzywański

Reputation: 16910

You could execute your task asynchronously as runnable in a threadpool using ExecutorService :

ExecutorService executorService = Executors.newCachedThreadPool();

Runnable runnable = () -> {
      stub.ping(request);
};

Future<?> submit = executorService.submit(runnable);

try {
     submit.get(1, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException e) {
     e.printStackTrace();
} catch (TimeoutException e) {
     System.out.println("Task was being executed for more than 1 second");
     //submit.cancel(true); to cancel this task and if it is responsive to interruption the task will finish
}

A TimeoutException will be thrown when task is being executed for more than the time you specified in get method. Note that the Future::get is a blocking operation.

Upvotes: 2

Blokje5
Blokje5

Reputation: 5003

You could use something like the TimeLimiter from the Google Guava library. This allows you to wrap a callable in an operation that you can call with Timeout. If the callable does not complete the operation in time, it will throw a TimeoutException which you can catch and return false after one second.

As an example:

TimeLimiter timeLimiter = new SimpleTimeLimiter();
try {
  String result = timeLimiter.callWithTimeout(
                () -> callToPing(), 1, TimeUnit.SECONDS);
  return true // Or something based on result
} catch (TimeoutException e) {
  return false
}

Upvotes: 3

Related Questions