2017-12-03 11 views
0

でWebソケットを使用したアクティビティフィードを作成する私は、最新の入ったユーザーと、私はこれらのサービスに入るいくつかの追加情報が表示されるダッシュボード、持っている:

@JsonView(View.SurveyWithClients.class) 
@RequestMapping(value="getData/{gender}",method=RequestMethod.GET) 
public @ResponseBody List<Info> getTopUsers(@PathVariable("gender") char gender) { 
    List<Info> info=infoService.findByClient_GenderOrderByInfoResults(gender); 
    return info; 

} 

そして、このいずれかを:

@JsonView(View.SurveyWithClients.class) 
@RequestMapping(value="getActivityFeed",method=RequestMethod.GET) 
public @ResponseBody List<Info> getLatestActivity() { 
    return infoService.findTop5ByOrderBySubmittedDateDesc(); 

} 

を私が現在やっていることは、これらの2つのエンドポイントへのajax呼び出しを行い、divで表示するデータを取得することです。 しかし、よりよい解決策になっているのは、ビューがリアルタイムで更新されるようにWebソケットを使用することです。

私が渡す必要のあるエンドポイント、またはサービス層ですか? コードの構造はどのように見えますか?これを達成するための論理的な道は何ですか? 私はチャットアプリケーションで使用されている例だけを見てきましたが、そのような計算やデータを使って行う方法はわかりません。 ガイダンスがあります

+0

にプッシュするために使用されるが、名前が示すように、クライアントにしてからデータを送信し、受信できるソケット、(ブラウザ)であるが、何のマッピングのように存在していない私のハンドラ関数はパスに基づいて呼び出されます。 SpringはWebソケットの上にSTOMPプロトコルをサポートしているので、HttpRequestのようなクライアント側からさまざまな関数を呼び出すことができます。リアルタイムでのクライアント上のビューの更新に関して、AngularJsとEmber.jsができることは、react.jsについてはわかりません – Zeronex

答えて

0

あなたのフィード用の2ウェイチャネルについて話しているのなら、意味があります。あなたが1つの方法について話しているのであれば、それも意味をなさないでしょうが、他にも多くのことがあることを覚えておく必要がありますhttpを使用して使用できる傾向。

websocketを使用している場合、HTTP以外のプロトコルを使用している場合、HTTPを使用して接続が確立されますが、HTTPプロトコルとは別の通信用にwebsocketが開かれます。これは私の意見では、同時HTTPリクエストを行う能力は限られています。

私はこの記事で Designing Complex Notification system in spring

をWebSocketをし、メッセージブローカーを使用してフィードを作成するための方法論を述べたあなたが必要とするすべては

https://mvnrepository.com/artifact/org.springframework/spring-websocket/5.0.2.RELEASE

websock依存性を含めることでも、あなたはのWebSocketを設定する必要がありますあなたの春のアプリケーションで

@Configuration 
@EnableWebSocket 
public class WebSocketConfig implements WebSocketConfigurer{ 

    @Autowired 
    private NotificationHandler notificationHandler; 

    @Override 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 
     System.out.println("handler registered for websocket"); 
     registry.addHandler(notificationHandler, "/questions")//define the endpoint for the websocket with handler to all the messages 
     .setAllowedOrigins("*").withSockJS(); //allow CRSF 

    } 

あなたはWebSocketをを使用することができ、特定のクライアント

@Component 
public class NotificationHandler extends TextWebSocketHandler { 

    private Map<Integer, WebSocketSession> sessions = new ConcurrentHashMap<>(); 
    private Map<String, List<Integer>> userToSessionMap = new ConcurrentHashMap<>(); 

    @Autowired 
    private JwtTokenUtil jwtTokenUtil; 

    @Autowired 
    private NotificationService notificationService; 

    @Value("${jwt.header}") 
    private String tokenHeader; 

    @Override 
    public void afterConnectionEstablished(WebSocketSession session) throws Exception { 
     sessions.put(Integer.valueOf(session.getId()), session); 
    } 

    @Override 
    protected void handleTextMessage(WebSocketSession session, TextMessage message) { 
     System.out.println("Session Id: " + session.getId()); 
     System.out.println("Session Id: " + session.getId()); 

     System.out.println("Extracted session ID " + sessions.get(Integer.valueOf(session.getId())).getId()); 
     String username = jwtTokenUtil.getUsernameFromToken(message.getPayload()); 
     if(username == null || username.isEmpty()) { 
      return; 
     } else if(!userToSessionMap.containsKey(username)) { 
      userToSessionMap.put(username, new ArrayList<Integer>()); 
      userToSessionMap.get(username).add(Integer.valueOf(session.getId())); 
     } else if(!userToSessionMap.get(username).contains(Integer.valueOf(session.getId()))) { 
      userToSessionMap.get(username).add(Integer.valueOf(session.getId())); 
     } 

     try { 
      sessions.get(Integer.valueOf(session.getId())).sendMessage(new TextMessage("new message recieved")); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void sendMessageToUserSessions(User user, String message) { 
     Notification notification = notificationService.createNotification(user, message); 
     List<Integer> sessionsList = userToSessionMap.get(user.getUsername()); 
     if(sessionsList == null || sessionsList.isEmpty())//no available sessions (makes no sense, need to check with UI) 
      return; 
     for(Integer sessionId: sessionsList) { 
      WebSocketSession session = sessions.get(sessionId); 
      if(session != null) 
       try { 
        session.sendMessage(new TextMessage(notification.toJsonString())); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       }; 
     } 
    } 

}