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 に答える