gpt4 book ai didi

java - 如何在J2EE应用程序中使用executorService进行http调用

转载 作者:行者123 更新时间:2023-12-02 11:21:21 26 4
gpt4 key购买 nike

我想了解在无状态 bean 中使用 ManagedExecutorService 。基本上,我试图在 j2EE 应用程序内的单独线程中发送 http 调用。 executorService 发送此请求并等待 x 秒来接收响应,如果在指定秒内没有响应或收到异常,则再进行一次尝试(X 次),然后最终给出 https 服务调用成功完成或失败的反馈。这是我的代码

@SuppressWarnings("EjbEnvironmentInspection")
@Resource
ManagedExecutorService executorService;

public static final long RETRY_DELAY = 3000;
public static final int MAX_RETRIES = 3;
executorService.execute(() -> {
int retry = 0;
Collection<Info> responseInfo = null;

while (responseInfo == null && retry++ < MAX_RETRIES) {
try {
responseInfo = httpsService.requestAccessInfo(requestInfo);
Thread.sleep(RETRY_DELAY);
} catch (Exception e) {
log.error("Error while receiving response retry attempt {}", retry);
}
}

boolean status = filledLockAccessInfo==null ? false : true;

event.fire(regularMessage(status,GENERATION_RESULT);

});

有人可以告诉我这样做是否正确。

最佳答案

您不应该需要强制 sleep (Thread.sleep(RETRY_DELAY);)。您需要的是可以支持超时的服务的异步调用。

以下两个方法使用可完成的 future API 的超时和错误处理来实现这一点。

以下使用递归重试给定的次数:

private static Collection<Info> callService(int retryCount) {

try {
CompletableFuture<Collection<Info>> f = invoke();
return f.get(RETRY_DELAY, TimeUnit.MILLISECONDS);
}catch(TimeoutException te) {
if(retryCount > 0) {
return callService(retryCount - 1);
} else {
throw new RuntimeException("Fatally failed!!");
}
} catch(Exception ee) {
throw new RuntimeException("Unexpectedly failed", ee);
}
}

请注意,executorService 对象是在 supplyAsync 的第二个参数中传递的

private static CompletableFuture<Collection<Info>> invoke() {
return CompletableFuture.supplyAsync(() -> {
//call
return httpsService.requestAccessInfo(requestInfo);;
}, executorService);
}

这样,您就可以简单地使用重试次数来调​​用它:

Collection<Info> responseInfo = callService(MAX_RETRIES);

要使上述调用异步运行,您可以将前面的语句替换为:

CompletableFuture.supplyAsync(() -> callService(MAX_RETRIES))
.thenAccept(res -> System.out.println("Result: " + res));

这将在后台进行调用。稍后,您可以检查它是如何完成的:

f.isCompletedExceptionally() //will tell whether it completed with an exception.

关于java - 如何在J2EE应用程序中使用executorService进行http调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49896326/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com