2012-12-04 5 views
0

웹 서비스 개발 초보자입니다. 우리는 봄 우리가 비동기 로그인 방법을 가지고 소비하는 3Java에서 비동기 웹 서비스 호출을 동기식으로 수행하십시오.

웹 서비스를 사용하여 자바 REST 웹 응용 프로그램을 구축하고있다. 우리는 그들의 서비스가 응답을 다시 게시하는 콜백 리스너 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의 "규칙"을 직접 위반하는지는 모르겠지만 원칙의 정신을 분명히 위반합니다. (또한 클라이언트가 어딘가에 웹 서비스를 호스트해야합니다. 단지 불쾌합니다.) –

답변

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. 
} 

LoginServicePostbackController 중첩 된 클래스를 확인하고 "사랑"PostbackController

+0

감사합니다 !! 예, 가능한 해결책 일 수 있으며 이미 조사했습니다. 그러나 예상대로 작동하지 않습니다. 우리는 리스너로 작동하는 컨트롤러를 만들었습니다. 리스너가 포스트 백 메시지를 받으면 객체를 업데이트합니다. 로그인 서비스를 스레드로 호출하고 10 초 동안 대기하고 매 2 초마다 객체의 상태를 확인하는 서비스가 있습니다. –

+0

예이 방법은 '폴링'이라고 불리지 만 단점은 많은 스레드가있어 오버 헤드가 발생한다는 것입니다. 따라서 interrupt() 또는 notify() 메커니즘을 사용하여 잠자는 스레드를 깨우십시오. 그것은 더 효율적일 것입니다. 새로운 코드를 공유 할 수 있다면이 문제를 해결하는 데 도움이 될 것입니다. –

+0

코드를 공유했습니다. 원래의 질문을 살펴보십시오. 감사. –

관련 문제