2012-12-04 178 views
0

我是Web服務開發人員的初學者。 我們正在使用Spring 3在Java中構建REST Web應用程序。將異步Web服務調用爲Java中的同步

我們正在使用的Web服務具有異步登錄方法。我們爲他們提供了一個回調監聽器URL,在這些URL中他們的服務回發響應。

因此,當我們發送登錄請求時,我們收到一個空白答覆作爲確認。並且服務在偵聽器URL上發送實際數據的響應。

請幫助,我應該如何設計/實現調用登錄服務作爲同步調用? 謝謝。

編輯: 下面是回發信息的偵聽器/控制器,它提取令牌並設置爲一個對象。

@Controller 
public class PostbackController { 

    @Autowried 
    public LoginResponse loginRS; 

    @RequestMapping(value = "/callbacklistener", method = RequestMethod.POST) 
    @ResponseBody 
    public String postbackHandler(@RequestParam("postback") String requestMessage) { 
     //We extract the token value from requestMessage. 
     String token = requestMessage; 
     loginRS.setToken(token); 
     return "<Confirm/>"; 
    } 
} 

以下是調用登錄服務的線程,並等待10秒。每2秒檢查一次物體的狀態。

public class LoginService extends Thread { 

    @Autowried 
    public LoginResponse loginRS; 

    public LoginService() { 
     this.start(); 
    } 

    @Override 
    public void run() { 
     try { 
      System.out.println("Thread Start."); 
      this.login(); 
      System.out.println("Thread Complete."); 
     } catch (InterruptedException e) {} 
    } 

    public LoginResponse login() { 
     String loginXML = ""; 
     String response = "";//by calling REST web service using RESTtemplate we get blank response. 

     for(i=0; i < 6; i++) { 
      if(loginRS.getToken().length > 0)) { 
       //Got the response exit from thread 
       break; 
      } 
      else { 
       //Wait for 2 second 
       Thread.sleep(2000) 
      } 
     } 
     return loginRS; 
    } 
} 

如果您需要更多信息,請讓我知道。由於

+0

哦相同的實例。雖然我不知道這是否直接違反了REST的「規則」,但它肯定違反了原則的精神。 (它還要求客戶端在某個地方託管Web服務,這只是令人討厭的。) –

回答

1

一些僞代碼給你的想法

Login request sender Thread{ 

    acknowledgement = sendLoginRequest 

    sleep() or wait on some lock 

} 


ListenerThread{ 

    response received = listenForResponse 

    lock.notifyAll() or interrupt Login Thread 

} 

這樣做可以讓這個同步。

UPDATE:

public class PostbackController { 

     @Autowried 
     public LoginResponse loginRS; 
     //instance 1 injected by Spring where you set the token 
} 



public class LoginService extends Thread { 

    @Autowried 
    public LoginResponse loginRS; 

    //a NEW instance will be created here also by Spring which will not have that token you set, as this is a new instance. So Thread will keep sleeping always. 
} 

PostbackController嵌套類LoginService並用「可愛」的PostbackController

+0

謝謝!是的,這可能是可能的解決方案,我們已經在研究這一點。但它沒有按預期工作。我們創建了一個作爲監聽器的控制器。當偵聽器收到回發消息時,它會更新一個對象。有一種服務以線程的形式調用登錄服務,並等待10秒,每2秒檢查一次對象的狀態。 –

+0

是的,這種方法被稱爲「輪詢」,但缺點是當會有很多線程時會產生開銷。所以你應該使用interrupt()或notify()機制來喚醒睡眠線程。那樣會更有效率。如果你能分享新的代碼,我可以幫你。 –

+0

分享代碼。請看原始問題。謝謝。 –