0

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

如果您需要更多信息,请告诉我。谢谢

4

1 回答 1

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

于 2012-12-04T10:37:22.990 回答