тайм-аут, если веб-сервис не отвечает в течение 1 секунды, а затем вернуть ноль - PullRequest
0 голосов
/ 28 мая 2018
public String getUldState(String uldNumber) throws SystemException {
    ProvideULDinformationRequest wsRequest = new ProvideULDinformationRequest();
    wsRequest.setIdcode(uldNumber);
    ProvideULDinformationResponse uldInfo = null;
    try {
        uldInfo = service.provideULDinformation(wsRequest);
    } catch (ProvideULDinformationBusinessException e) {
        e.printStackTrace();
    } 
    if (uldInfo != null) {
        return uldInfo.getUldPhysicalStatus();      
    }       
    return null;
}

Я хотел бы вернуть значение NULL, если веб-служба предоставить UDinformation не отвечает через одну секунду.

1 Ответ

0 голосов
/ 28 мая 2018

Oneeway должен использовать CompletableFuture<>, чтобы сделать тайм-аут.

Сначала оберните ваш фактический код в частный метод:

private String getUldStatePrivate(String uldNumber) throws SystemException {
    ProvideULDinformationRequest wsRequest = new ProvideULDinformationRequest();
    wsRequest.setIdcode(uldNumber);
    ProvideULDinformationResponse uldInfo = null;
    try {
        uldInfo = service.provideULDinformation(wsRequest);
    } catch (ProvideULDinformationBusinessException e) {
        e.printStackTrace();
    } 
    if (uldInfo != null) {
        return uldInfo.getUldPhysicalStatus();      
    }       
    return null;
}

Затем вызовите его с вашего контроллера:

public String getUldState(String uldNumber) {
    CompletableFuture<String> response = CompletableFuture.supplyAsync(() -> getUldStatePrivate(uldNumber));

    try {
        return response.get(1, TimeUnit.SECONDS);
    } catch(TimeoutException ex) {
        // timeout, log error, return
        return null
    }
}

В Java 7 вы можете использовать обычный FutureTask:

ExecutorService pool = Executors.newFixedThreadPool(10);

public String getUldState(String uldNumber) {
    FutureTask<String> response = new FutureTask<>(new Callable<String>() {
        @Override
        public String call() throws Exception {
            return getUldStatePrivate(uldNumber);
        }
    });
    pool.execute(response);

    try {
        return response.get(1, TimeUnit.SECONDS);
    } catch(TimeoutException ex) {
        // timeout, log error, return
        return null
    }
}
...