是否可以使java方法超时?

时间:2019-05-13 15:07:38

标签: java

我需要执行ping Web服务来检查我是否与端点连接并且Web服务服务器一切正常。

这有点愚蠢,但是我必须为此打电话给网络服务。问题是,当我呼叫stub.ping(request)而没有连接时,它会继续尝试执行此代码一分钟……然后返回false。

如果无法ping通,是否可以在1秒后使此超时?

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

2 个答案:

答案 0 :(得分:2)

您可以使用Google Guava库中的TimeLimiter之类的东西。这允许您将可调用对象包装在可以使用超时调用的操作中。如果可调用对象未及时完成操作,它将抛出TimeoutException,您可以捕获它并在一秒钟后返回false。

例如:

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
}

答案 1 :(得分:1)

您可以使用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");
}

当执行任务的时间超过您在TimeoutException方法中指定的时间时,将抛出get。请注意,Future::get是阻止操作。