2017-11-10 17 views
0

stomp 클라이언트 및 웹 소켓을 사용하여 스프링 부트에서 클라이언트로 데이터를 전송합니다. 첫 번째 사용자에게 데이터를 보낼 수 있지만 사용자가 증가하자마자 일부 사용자 만 데이터를 가져옵니다. 이것은 모든 사용자가 동일한 행동을해야하기 때문에 이상하게 보입니다. 내가 대기열 ('/ 사용자/대기열')에 연결하고 그것을 듣고있는 한 명 이상의 클라이언트가 있기 때문에 이것에 대한 이유가 광범위하게 연구 된 후에 알게되었습니다. 이 문제를 피하는 방법 또는이 문제를 해결하는 것은 불가능합니다. 나는 그 특정 세션 ID에 데이터를 전송 할 수있는 유일한 방법이기 때문에 대기열을 사용해야은 -Stomp 클라이언트가 연결이 설정된 경우에도 항상 데이터를 가져 오지 못함

var socket = new SockJS('/gs-guide-websocket'); 

     var stompClient = Stomp.over(socket); 
     stompClient.connect({ }, function(frame) { 
     console.log('Connected this ' + frame); 
    stompClient.subscribe("/user/queue/cache", function(data) { 
     // code to display this data.......... 
               }); 

코드 -

@Controller 
    public class ScheduledUpdatesOnTopic { 

@Autowired  
public SimpMessageSendingOperations messagingTemplate; 

@Autowired 
private SimpMessagingTemplate template;  


DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
Date date = new Date(); 
String json[][] = {{"Lokesh Gupta","34","India",df.format(date)},{"Meenal","23","Pakistan",df.format(date)},{"Gongo","12","Indonesia",df.format(date)},{"Abraham","17","US",df.format(date)},{"Saddam","56","Iraq",df.format(date)},{"Yimkov","67","Japan",df.format(date)},{"Salma","22","Pakistan",df.format(date)},{"Georgia","28","Russia",df.format(date)},{"Jaquline","31","Sri Lanka",df.format(date)},{"Chenchui","78","China",df.format(date)}}; 
String t[] = {"Lokesh Gupta","34","India","11/8/2017"}; 
String temp[][]; 
int p=0; 
int count=0; 
private MessageHeaderInitializer headerInitializer; 




@MessageMapping("/hello") 
    public void start(SimpMessageHeaderAccessor accessor) throws Exception 
{ 
    String applicantId=accessor.getSessionId();   



    System.out.println("session id " + applicantId); 

this.messagingTemplate.convertAndSendToUser(applicantId,"/queue/cache",json,createHeaders(applicantId)); 
} 

private MessageHeaders createHeaders(String sessionId) { 
    SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE); 
    if (getHeaderInitializer() != null) { 
     getHeaderInitializer().initHeaders(headerAccessor); 
    } 
    headerAccessor.setSessionId(sessionId); 
    headerAccessor.setLeaveMutable(true); 
    return headerAccessor.getMessageHeaders(); 
    } 


public MessageHeaderInitializer getHeaderInitializer() { 
    return this.headerInitializer; 
} 



public void setHeaderInitializer(MessageHeaderInitializer headerInitializer) { 
    this.headerInitializer = headerInitializer; 
} 

그리고 클라이언트 측 HTML 내 컨트롤러. 어떤 도움을 주시면 감사하겠습니다 !!

답변

0

"요청 - 응답"메시징 패턴을 사용해야하는 것 같습니다.

클라이언트가 공용 대기열의 서버에 연결하면 개인 반환 주소가 포함됩니다. 이 리턴 주소는 서버와 클라이언트가 독점적으로 사용하는 새로운 개인용 메세지 대기열 이름을 생성하는 데 사용될 수 있습니다 (전용 리턴 주소를 알고있는 유일한 2이므로 서버는 개인용 메세지 대기열을 통해 클라이언트 데이터를 보낼 수 있습니다).

/큐/개인 반환 주소는 예를 들어 임의의 UUID가 될 수 있고, 개인 큐의 이름이 될 수 있습니다..이 "요청 - 응답"메시징 패턴이 형식적으로 다른 유용한 메시지들, 여기에 설명

패턴 : http://www.enterpriseintegrationpatterns.com/patterns/messaging/ReturnAddress.html