Java 在任务完成前返回
Java returning before tasks complete
我有一个方法,它调用了另一个方法,结果并不重要。确切地说,它是对 Web 服务的 POST 请求,结果在该方法中处理,而不是在调用方法中处理。现在我希望 main 方法在该任务完成之前 return。
本质上,我需要某种异步性。我可以在 Java 中使用哪些工具?下面是步骤:
- 方法
A
调用方法B
- 方法
B
开始执行(我们对方法 b 的结果不感兴趣:它调用 Web 服务并自行处理结果)
- 方法
A
return 方法 B
完成前
您可以使用 CompletableFuture.runAsync()
异步调用方法 B。
如果您想在方法 B 退出时执行某些操作,您可以通过调用 .thenRun()
返回的 future 添加回调
new Thread(new Runnable() {
public void run() {
//Do whatever
}
}).start();
尝试使用AsyncHttpClient,例子
`AsyncHttpClient asyncHttpClient = new AsyncHttpClient(
builder.setFollowRedirect(true).
setWebSocketTimeout(120000).
setAcceptAnyCertificate(true).
setMaxConnections(100).
setMaxRequestRetry(3).
setReadTimeout(120000).
setConnectTimeout(120000).
setRequestTimeout(120000).
build());
asyncHttpClient.prepareGet(url).execute(new AsyncCompletionHandler<Response>(){
@Override
public Response onCompleted(Response response) throws Exception{
//your logic here
}
@Override
public void onThrowable(Throwable t){
//your logic here
}
});
`
如果您使用的是 Spring,那么它非常简单,无需任何样板代码。查看 @Async support in Spring. Here is a very simple example 以快速入门。
@Service
public class YourClass {
public void methodA() {
methodB();
}
@Async
public void methodB() {
// Your POST logic
}
}
要在您的 xml 配置中启用 async
支持,您需要具有如下内容
<task:annotation-driven />
<task:executor id="defaultAsyncTaskExecutor" pool-size="5-15" queue-capacity="100" />
我有一个方法,它调用了另一个方法,结果并不重要。确切地说,它是对 Web 服务的 POST 请求,结果在该方法中处理,而不是在调用方法中处理。现在我希望 main 方法在该任务完成之前 return。
本质上,我需要某种异步性。我可以在 Java 中使用哪些工具?下面是步骤:
- 方法
A
调用方法B
- 方法
B
开始执行(我们对方法 b 的结果不感兴趣:它调用 Web 服务并自行处理结果) - 方法
A
return 方法B
完成前
您可以使用 CompletableFuture.runAsync()
异步调用方法 B。
如果您想在方法 B 退出时执行某些操作,您可以通过调用 .thenRun()
返回的 future 添加回调
new Thread(new Runnable() {
public void run() {
//Do whatever
}
}).start();
尝试使用AsyncHttpClient,例子
`AsyncHttpClient asyncHttpClient = new AsyncHttpClient(
builder.setFollowRedirect(true).
setWebSocketTimeout(120000).
setAcceptAnyCertificate(true).
setMaxConnections(100).
setMaxRequestRetry(3).
setReadTimeout(120000).
setConnectTimeout(120000).
setRequestTimeout(120000).
build());
asyncHttpClient.prepareGet(url).execute(new AsyncCompletionHandler<Response>(){
@Override
public Response onCompleted(Response response) throws Exception{
//your logic here
}
@Override
public void onThrowable(Throwable t){
//your logic here
}
});
`
如果您使用的是 Spring,那么它非常简单,无需任何样板代码。查看 @Async support in Spring. Here is a very simple example 以快速入门。
@Service
public class YourClass {
public void methodA() {
methodB();
}
@Async
public void methodB() {
// Your POST logic
}
}
要在您的 xml 配置中启用 async
支持,您需要具有如下内容
<task:annotation-driven />
<task:executor id="defaultAsyncTaskExecutor" pool-size="5-15" queue-capacity="100" />