2013-07-28 161 views
2

我有一個相當標準的GWT表單,它執行從註冊表單抓取數據並將其存儲在數據庫中的基本功能。如何在GWT中執行多線程?

authenticationService.registerStudent(email, password, firstName, lastName, contact, 
      country, countryCode, school, lecturerFirstName, lecturerLastName, 
      lecturerEmail, language, new AsyncCallback<Boolean>() { 

     @Override 
     public void onFailure(Throwable throwable) { 

     } 

     @Override 
     public void onSuccess(Boolean bool) { 

     } 
    }); 

在服務器端,我有一個servlet將數據存儲到數據庫中。

public class AuthenticationServiceImpl extends RemoteServiceServlet implements AuthenticationService { 

@Override 
public Boolean registerStudent(String email, String password, String firstName, String lastName, 
           String contact, String country, String countryCode, String school, 
           String lecturerFirstName, String lecturerLastName, String lecturerEmail, 
           String language) throws IllegalArgumentException { 

    .... 

    } 
} 

我想發送確認郵件給要求他確認帳戶的人。在registerStudent()函數中實現電子郵件邏輯的問題是,可能需要一段時間才能與SMTP服務器通信,這將導致客戶端無響應。

如何將發送電子郵件功能委派給其他班級/功能,同時在成功插入數據庫後能夠從registerStudent()功能返回true?我認爲將會需要某種形式的多線程,但我不確定如何去做。

+0

我同意sanbhat的答案。另外,特別是關於發送註冊郵件的這個問題,我會說同步發送電子郵件(即:鎖定客戶端並等待電子郵件發送)並不是一個很糟糕的選擇,因爲那樣你將能夠提供反饋給客戶端,如果發生錯誤發送電子郵件,如「超載服務,請稍後再試」.... –

回答

4

AuthenticationServiceImpl是GWT Servlet,這裏有沒有限制在任何Java的庫的使用。您可以創建Runnable並將其傳遞給Thread並調用start(),以便它並行發送郵件。可運行的run()方法應具有發送電子郵件的邏輯。

你可以看到更多的文檔和示例對多線程here

+1

我認爲這是正確的答案,因爲重要的是:您可以在servlet中做任何你想做的事情。然後,根據您在服務器端使用的框架,可能會有數千個可能的實現和設計來發送該電子郵件:) –

2

由於在服務器端,你可以完全訪問Java類庫,可以使用線程啓動一個新的線程負責發送電子郵件的照顧。

事情是這樣的:

public class sendRegistrationEmail implements Runnable { 
    @Override public void run() { 
     ... here goes the code to send email ... 
} 

然後就可以開始一個新線程:

Thread emailThread = new Thread(new sendRegistrationEmail()); 
emailThread.start();