2017-10-12 79 views
0

确认返回给调用者之前开始长执行我有一个服务方法暴露给外部客户是这样的:如何在Java中

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()返回的曲目ID。 client()不关心在service()中发生的长执行过程,该过程延迟client()中的语句1至3。

现在有什么办法让service()先返回track 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 .... 
    } 

注:我不想存储任何在DB然后才能运行后取以任何方式在service()长执行。长时间执行应该在接到来电时运行client()

回答

1

您的代码将在容器管理的池的线程中执行。响应将不会被发送到客户端,直到你的方法完成

可以运行长期任务启动一个单独的线程,让主线程结束返回轨道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; 
} 
1

如何使用两种方法?

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吗?