PushService.java 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package com.gyee.alarm.stomp;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
  4. import org.springframework.messaging.simp.SimpMessageType;
  5. import org.springframework.messaging.simp.SimpMessagingTemplate;
  6. import org.springframework.scheduling.annotation.Scheduled;
  7. import org.springframework.stereotype.Service;
  8. import javax.annotation.Resource;
  9. import java.time.LocalDateTime;
  10. import java.time.format.DateTimeFormatter;
  11. import java.util.Random;
  12. import java.util.concurrent.atomic.AtomicInteger;
  13. @Service
  14. public class PushService {
  15. private final AtomicInteger broadcastCounter = new AtomicInteger(0);
  16. private final AtomicInteger privateCounter = new AtomicInteger(0);
  17. @Resource
  18. private SimpMessagingTemplate messagingTemplate;
  19. @Resource
  20. private WebSocketSessionManager sessionManager;
  21. // 每3秒群发一次消息
  22. @Scheduled(fixedRate = 3000)
  23. public void broadcastData() {
  24. String content = "系统广播 #" + broadcastCounter.incrementAndGet() +
  25. " | 时间: " + LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_TIME);
  26. PushMessage msg = new PushMessage(content, "BROADCAST", "SERVER");
  27. messagingTemplate.convertAndSend("/topic/public", msg);
  28. }
  29. // 每5秒随机选择一个用户发送私信
  30. @Scheduled(fixedRate = 5000)
  31. public void sendRandomPrivateMessage() {
  32. String randomUser = "user1";
  33. String content = "系统私信 #" + privateCounter.incrementAndGet() +
  34. " | 仅您可见";
  35. PushMessage msg = new PushMessage(content, "PRIVATE", "SERVER", randomUser);
  36. if(sessionManager.getUserSessionMap().containsKey(randomUser))
  37. {
  38. String sessionId = sessionManager.getUserSessionMap().get(randomUser);
  39. SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
  40. headerAccessor.setSessionId(sessionId);
  41. // headerAccessor.setLeaveMutable(true);
  42. messagingTemplate.convertAndSendToUser(
  43. sessionId,
  44. "/queue/private",
  45. msg, headerAccessor.getMessageHeaders()
  46. );
  47. }
  48. }
  49. // 群发消息方法
  50. public void sendBroadcast(String content) {
  51. PushMessage msg = new PushMessage(content, "BROADCAST", "ADMIN");
  52. messagingTemplate.convertAndSend("/topic/public", msg);
  53. }
  54. // 单独发送消息方法
  55. public void sendPrivateMessage(String userId, String content) {
  56. PushMessage msg = new PushMessage(content, "PRIVATE", "ADMIN", userId);
  57. messagingTemplate.convertAndSendToUser(userId, "/queue/private", msg);
  58. }
  59. }