2017-10-12 48 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嗎?