Reputation: 209
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
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
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