spring message使用

  • websocket配置
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;


@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

  @Override
  public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/ws").withSockJS();
  }

  @Override
  public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.setApplicationDestinationPrefixes("/app");
    registry.enableSimpleBroker("/channel");
  }
}


  • 监听器注册
import com.xebia.chatroom.dao.ChatRoomDao;
import com.xebia.chatroom.dao.RoomsUserDao;
import com.xebia.chatroom.dao.UserRoomsDao;
import com.xebia.chatroom.model.ChatMessage;
import com.xebia.chatroom.model.ChatMessage.MessageType;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.messaging.simp.SimpMessageSendingOperations;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.messaging.SessionConnectedEvent;
import org.springframework.web.socket.messaging.SessionDisconnectEvent;


@Component
public class WebSocketEventListener {

  private static final Logger logger = LoggerFactory.getLogger(WebSocketEventListener.class);
  
  @Autowired
  private UserRoomsDao userRoomsDao;

  @Autowired
  private RoomsUserDao roomsUserDao;

  @Autowired
  private SimpMessageSendingOperations messagingTemplate;

  @EventListener
  public void handleWebSocketConnectListener(SessionConnectedEvent event) {
    logger.info("Received a new web socket connection.");
  }

  @EventListener
  public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) {
    StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage());

    String username = (String) headerAccessor.getSessionAttributes().get("username");
    String roomId = (String) headerAccessor.getSessionAttributes().get("room_id");
    if (username != null) {
      logger.info("User Disconnected: " + username);

      ChatMessage chatMessage = new ChatMessage();
      chatMessage.setType(MessageType.LEAVE);
      chatMessage.setSender(username);

      messagingTemplate.convertAndSend(format("/channel/%s", roomId), chatMessage);
      
      userRoomsDao.removeRoom(chatMessage.getSender(), roomId);
      roomsUserDao.removeUsername(roomId, chatMessage.getSender());
    }
  }
}
  • 多房间controller
package com.xebia.chatroom.controller;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.xebia.chatroom.dao.ChatRoomDao;
import com.xebia.chatroom.dao.RoomsUserDao;
import com.xebia.chatroom.dao.UserRoomsDao;


@Controller
public class RoomsController {

    @Autowired
    private ChatRoomDao chatRoomDao;
    
    @Autowired
    private UserRoomsDao userRoomsDao;
    
    @Autowired
    private RoomsUserDao roomsUserDao;
    
    @CrossOrigin
    @GetMapping
    @RequestMapping(value = "/all/room/list")
    public ResponseEntity<Map<String, String>>  roomList() {
        return new ResponseEntity<Map<String, String>>(chatRoomDao.roomList(), HttpStatus.OK);
    }
    
    @CrossOrigin
    @GetMapping
    @RequestMapping(value = "/user/room/list")
    public ResponseEntity<List<String>> userRoomList(@RequestParam("username") String username) {
        return new ResponseEntity<List<String>>(userRoomsDao.userChatRooms(username), HttpStatus.OK);
    }
    
    @CrossOrigin
    @GetMapping
    @RequestMapping(value = "/room/user/list")
    public ResponseEntity<List<String>> roomUserList(@RequestParam("chatroom") String chatroom) {
        return new ResponseEntity<List<String>>(roomsUserDao.chatRoomsUsers(chatroom), HttpStatus.OK);
    }
    
}

package com.xebia.chatroom.controller;

import static java.lang.String.format;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import org.springframework.messaging.simp.SimpMessageSendingOperations;
import org.springframework.stereotype.Controller;

import com.xebia.chatroom.dao.ChatRoomDao;
import com.xebia.chatroom.dao.RoomsUserDao;
import com.xebia.chatroom.dao.UserRoomsDao;
import com.xebia.chatroom.model.ChatMessage;
import com.xebia.chatroom.model.ChatMessage.MessageType;


@Controller
public class ChatController {

    private static final Logger logger = LoggerFactory.getLogger(WebSocketEventListener.class);

    @Autowired
    private ChatRoomDao chatRoomDao;

    @Autowired
    private UserRoomsDao userRoomsDao;

    @Autowired
    private RoomsUserDao roomsUserDao;

    @Autowired
    private SimpMessageSendingOperations messagingTemplate;

    @MessageMapping("/chat/{roomId}/sendMessage")
    public void sendMessage(@DestinationVariable String roomId, @Payload ChatMessage chatMessage) {
        messagingTemplate.convertAndSend(format("/channel/%s", roomId), chatMessage);
    }

    @MessageMapping("/chat/{roomId}/addUser")
    public void addUser(@DestinationVariable String roomId, @Payload ChatMessage chatMessage, SimpMessageHeaderAccessor headerAccessor) {
        String currentRoomId = (String) headerAccessor.getSessionAttributes().put("room_id", roomId);
        if (currentRoomId != null) {
            ChatMessage leaveMessage = new ChatMessage();
            leaveMessage.setType(MessageType.LEAVE);
            leaveMessage.setSender(chatMessage.getSender());
            messagingTemplate.convertAndSend(format("/channel/%s", currentRoomId), leaveMessage);
            userRoomsDao.removeRoom(chatMessage.getSender(), roomId);
            roomsUserDao.removeUsername(roomId, chatMessage.getSender());
        } else {
            chatRoomDao.addRoom(chatMessage.getSender(), roomId);
            userRoomsDao.addRoom(chatMessage.getSender(), roomId);
            roomsUserDao.addRoom(roomId, chatMessage.getSender());
        }

        headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
        messagingTemplate.convertAndSend(format("/channel/%s", roomId), chatMessage);
    }
}

发布了177 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_38331049/article/details/104481127
今日推荐