2017-11-10 10 views
0

stompクライアントとWebソケットを使用して、春の起動からクライアントにデータを送信しています。それは第1のユーザにデータを送ることができるが、ユーザが増加するとすぐに一部のユーザのためにデータを取得する。これは、その動作がすべてのユーザーにとって同じである必要があるため、奇妙に思えます。私は、キュー( '/ user/queue')に接続していて、それを聞いている複数のクライアントを持っているため、この理由が広範な調査の結果わかった。どのようにこの問題を回避するか、この問題を解決することは不可能です。 接続が確立されていてもStompクライアントは常にデータを取得していません

@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は -

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

コード - 私のコントローラは、私は特定のセッションIDにデータを送信するための唯一の方法であるため、キューを使用する必要があります。どんな助けもありがとう!

答えて

0

"Request-Reply"メッセージングパターンを使用する必要があるようです。

クライアントが共通キューのサーバーに接続すると、プライベートリターンアドレスが含まれます。このリターンアドレスは、プライベートリターンアドレスを知っている唯一の2であるため、サーバーとクライアントが排他的に使用する新しいプライベートメッセージキュー名を生成するために使用できます。サーバーはプライベートメッセージキューを介してクライアントデータを送信できます。

/キュー/プライベートリターンアドレスは、例えば、ランダムなUUIDすることができ、プライベートキュー名がある可能性があります。この「要求 - 応答」メッセージ・パターンは、より正式に他の有用なメッセージングの中で、ここで説明されて

パターン: http://www.enterpriseintegrationpatterns.com/patterns/messaging/ReturnAddress.html

関連する問題