我是网络服务开发的初学者。 我们正在使用Spring 3在java中构建REST Web应用程序。
我们正在使用的Web服务具有异步登录方法。我们为他们提供了一个回调监听器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 :(得分:1)
一些伪代码给你的想法
Login request sender Thread{
acknowledgement = sendLoginRequest
sleep() or wait on some lock
}
ListenerThread{
response received = listenForResponse
lock.notifyAll() or interrupt Login Thread
}
这样做可以实现同步。
<强>更新强>
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
实例