在Java中将异步Web服务调用视为同步

时间:2012-12-04 10:26:52

标签: java web-services rest asynchronous synchronous

我是网络服务开发的初学者。 我们正在使用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;
    }
}

如果您需要更多信息,请与我们联系。感谢

1 个答案:

答案 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实例