2012-12-04 134 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

分享代码。请看原始问题。谢谢。 –