2014-07-14 3 views
4

웹 소켓을 통해 브로커 메시지에 스톰프 (Stomp)를 사용하여 애플리케이션을 빌드하고 있습니다. 응용 프로그램의 아무 곳에서나 요청하지 않고 서버에서 클라이언트로 메시지를 보내려고합니다. 응용 프로그램의 어느 곳에서나 메시지를 보낼 수있는 온라인 2 가지 옵션을 발견했습니다. 스프링 STOMP는 애플리케이션의 어느 곳에서나 메시지를 전송합니다.

첫 번째

Websocket documentation. 섹션 20.4.5에서 발견된다 :

@Controller 
public class GreetingController { 

    private SimpMessagingTemplate template; 

    @Autowired 
    public GreetingController(SimpMessagingTemplate template) { 
     this.template = template; 
    } 

    @RequestMapping(value="/greetings", method=POST) 
    public void greet(String greeting) { 
     String text = "[" + getTimestamp() + "]:" + greeting; 
     this.template.convertAndSend("/topic/greetings", text); 
    } 

} 

두 번째는 a guide written by one of the Spring Bloggers에 있습니다

@Controller 
public class GreetingController { 

    @Autowired 
    private SimpMessagingTemplate template; 


    @RequestMapping(value="/greeting", method=POST) 
    public void greet(String greeting) { 
    String text = "[" + getTimeStamp() + "]:" + greeting; 
    this.template.convertAndSend("/topic/greeting", text); 
    } 

} 

은 모두 매우 유사합니다. 첫 번째 매개 변수는 기본 생성자를 재정의하고 템플릿 초기화를 자동 실행하지 않습니다. 두 번째는 새 생성자를 만들지 않지만 템플릿 초기화를 자동 실행합니다. 나의 첫 번째 질문은이 두 가지 행동이 동등한가하는 점이다.

더 중요한 것은 어디에서나 "인사"방법을 호출하는 데 문제가 있다는 것입니다. 나는 이것을 여러 가지 방법으로 시도했다. 여기

은 처음이다 : 새로운 HelloController가 초기화되지 않습니다 것처럼

위의 경우
public class modifier { 

    @Autowired 
    private HelloController sender; 


    public void adder(String words) throws Exception { 
     sender.greet(words); 

    } 
} 

, 그것은 보인다. 디버깅 할 때 adder 메서드가 "greet"메서드를 호출하면 보낸 사람이 null이고 null 포인터 예외가 발생한다는 것을 알았습니다. 그러나 그것으로 아니다

public class modifier { 

    public void adder(String words) throws Exception { 
     HelloController sender = new HelloController(); 
     sender.greet(words); 
} 

}이 제 상술 경우

는 디버깅 후에, 또한 널 포인터 예외가있다 : 여기

내가 설정 사용한 다른 경로이고 보내는 사람. 그것은 sender.template입니다. 보낸 사람의 템플릿이 초기화되지만 절대 값이나 ID가 주어지지 않습니다. 그런 다음 this.template.convertAndSend()가 인사이드 (greet) 내부에서 호출되면 this.template에서 널 포인터 예외가 발생합니다.

컨트롤러의 두 gound 구현과 응용 프로그램의 별도 클래스에서 greet 메서드를 호출하는 두 가지 구현을 모두 섞어서 사용할 수 있습니다.

내 문제를 해결할 수있는 사람이 있습니까? 어떤 도움, 조언, 또는 조언을 크게 주시면 감사하겠습니다!

미리 감사드립니다.

+1

그들은 동일합니다. 유일한 차이점은 다른 생성자 기반 주입을 기반으로 필드 기반 주입을 사용한다는 것입니다. 그것은 유일한 차이점입니다. 컨트롤러는 다른 클래스에서 사용하면 안되며 컨트롤러는 웹 레이어 구성 요소이므로 엄지 손가락으로 다른 클래스 안에서 사용하면 안됩니다. 기능을 재사용하려면 컨트롤러와 다른 클래스 모두에 주입하는 서비스 클래스로 이동하십시오. 당신은 스스로 주입을 사용하지 않고 스스로 객체 인스턴스를 생성하고 있으며, 스프링이 객체를 관리하도록합니다. –

+0

아, 그래, 확실히 많은 문제를 해결했다. 어떤 부분을 컨트롤러가 아닌 서비스 클래스에 넣어야합니까? – Theo

답변

1

주석에 올바르게 쓰여 있듯이 종속성을 autowire하는 여러 가지 방법이 있습니다. 이들은 대부분 동등하므로 필요에 따라 원하는 것을 선택해야합니다.

다른 질문으로 컨트롤러는 사용자 요청을 듣는 객체 (싱글 톤)이므로 @RequestMapping 매핑은 HTTP 요청을 지정된 URL로 처리합니다.

SimpMessagingTemplate 개체를 사용하여 서버에서 클라이언트로 메시지를 푸시해야하는 경우 클라이언트가 STOMP 프로토콜 (웹 소켓 이상)을 사용해야하며 올바른 항목을 구독해야한다는 것을 알아야합니다.

실제로 STOMP를 사용하면 서버가 임의로 클라이언트에 메시지를 보낼 수는 없지만 메시지는 주제로만 게시 할 수 있으며 클라이언트는 메시지를 수신하려면 올바른 주제에 가입해야합니다.

관련 문제