在Java中,如何在开始长时间执行之前向调用方返回确认
我有一个向外部客户端公开的服务方法,如下所示:在Java中,如何在开始长时间执行之前向调用方返回确认,java,web-services,Java,Web Services,我有一个向外部客户端公开的服务方法,如下所示: public String service() { String track_id; // Generate new track id for each call somehow // let us put as 123 for simplicity track_id = "123"; // Execution that may take 1 minute goes here .... ret
public String service()
{
String track_id;
// Generate new track id for each call somehow
// let us put as 123 for simplicity
track_id = "123";
// Execution that may take 1 minute goes here ....
return track_id;
}
然后,我有一个使用该服务的客户端,如:
public void client()
{
// Method Call
String track_id = service();
// Other statements
//statement 1;
//statement 2;
//statement 3;
}
client()
唯一关心的是service()
返回的曲目idclient()
不关心service()
中发生的长时间执行过程,该过程会延迟client()
中的语句1到3
现在有没有办法让service()
首先返回曲目id,然后运行其余的执行过程。听起来很疯狂,但是有没有办法改变service()
方法以实现以下行为:
public String service()
{
String track_id;
// Generate new track id for each call somehow
// let us put as 123 for simplicity
track_id = "123";
return track_id;
// Execution that may take 1 minute goes here ....
}
注意:我不想在数据库中存储任何内容,然后再以任何方式获取它,以便在
service()
中运行长时间执行。长执行应该在接收来自客户端()的调用时运行如何使用两种方法
public String fastService() {
String track_id;
track_id = "123";
return track_id;
}
您可能希望使用生成的id
public String slowService(String id) {
// zzZzZZzZZ
}
在客户端调用中,按您需要的顺序:
public void client() {
String track_id = fastService();
// Other statements
slowService(track_id);
}
但是,要小心如果按此顺序调用方法,会影响行为吗?如果慢速服务不成功,您会再次生成id吗?使用两种方法如何
public String fastService() {
String track_id;
track_id = "123";
return track_id;
}
您可能希望使用生成的id
public String slowService(String id) {
// zzZzZZzZZ
}
在客户端调用中,按您需要的顺序:
public void client() {
String track_id = fastService();
// Other statements
slowService(track_id);
}
但是,要小心如果按此顺序调用方法,会影响行为吗?如果慢速服务没有成功,您会再次生成id吗?您的代码将在容器管理的池的线程中执行。在方法完成之前,不会将响应发送到客户端
您可以从一个单独的线程开始运行长任务,并让主线程返回轨迹id
public String service() {
String track_id;
// Generate new track id for each call somehow
// let us put as 123 for simplicity
track_id = "123";
//Asynchronous thread
(new Thread() {
public void run() {
// Execution that may take 1 minute goes here ....
}
}).start();
return track_id;
}
您的代码将在容器管理的池的线程中执行。在方法完成之前,不会将响应发送到客户端
您可以从一个单独的线程开始运行长任务,并让主线程返回轨迹id
public String service() {
String track_id;
// Generate new track id for each call somehow
// let us put as 123 for simplicity
track_id = "123";
//Asynchronous thread
(new Thread() {
public void run() {
// Execution that may take 1 minute goes here ....
}
}).start();
return track_id;
}