如何在连接到spring websocket时向用户发送消息
我想在连接到spring websocket时向用户发送消息,我已经
@Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Autowired private GenervicSerice userService; @Autowired private SimpMessagingTemplate template; private CurrentUser currnetUser; @Override public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) { // TODO Auto-generated method stub stompEndpointRegistry.addEndpoint("/ws").withSockJS(); } @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/queue/", "/topic/", "/exchange/"); config.setApplicationDestinationPrefixes("/app"); } @Override public void configureClientInboundChannel(ChannelRegistration registration) { registration.setInterceptors(myChannelInterception()); try { updateNotificationAndBroadcast(); } catch (Exception e) { return; } } @Bean public MyChannelInterception myChannelInterception() { return new MyChannelInterception(); } private void updateNotificationAndBroadcast() { try { template.convertAndSend("/queue/notify", "Greetings"); } catch (Exception e) { System.out.println("Error message is " + e.getMessage() + "\n\n\n" + "Caused by " + e.getCause() ); } } }
MyChannelInterception类是
public class ImtehanChannelInterception extends ChannelInterceptorAdapter { private CurrentUser currnetUser; @Override public Message preSend(Message message, MessageChannel channel) { MessageHeaders headers = message.getHeaders(); SimpMessageType type = (SimpMessageType) headers.get("simpMessageType"); String simpSessionId = (String) headers.get("simpSessionId"); currnetUser = new CurrentUser(); if (type == SimpMessageType.CONNECT) { Principal principal = (Principal) headers.get("simpUser"); currnetUser.setCurrentUserEmail(principal.getName()); System.out.println("WsSession " + simpSessionId + " is connected for user " + principal.getName()); } else if (type == SimpMessageType.DISCONNECT) { System.out.println("WsSession " + simpSessionId + " is disconnected"); } return message; } }
通过这个我获得有关新连接用户的信息,但WebSocketConfig
的方法updateNotificationAndBroadcast()
不向新登录用户发送消息。
我会创建SessionSubscribeEvent
监听器并在里面使用SimpMessagingTemplate
。
顺便说一下, configureClientInboundChannel
只调用一次(不是每个连接的用户)。 所以你必须处理在拦截器内发送消息。
尝试这样的事情:
@Service public class SomeSubscribeListener { private SimpMessagingTemplate template; @Autowired public SomeSubscribeListener(SimpMessagingTemplate template) { this.template = template; } @EventListener public void handleSubscribeEvent(SessionSubscribeEvent event) { template.convertAndSendToUser(event.getUser().getName(), "/queue/notify", "GREETINGS"); } }
我希望这个能帮上忙
你需要一个Websocketconfig文件:
package mx.config.ws; @EnableScheduling @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/chat").withSockJS() } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { ... } }
并声明另一个@Configuration文件:
package mx.config.ws; @Configuration public class WebSocketHandlersConfig { @Bean public StompConnectEvent webSocketConnectHandler() { return new StompConnectEvent(); } @Bean public StompDisconnectEvent webSocketDisconnectHandler() { return new StompDisconnectEvent(); } }
接下来创建ApplicationListener接口的实现。 自动拦截STOMP连接
package mx.config.ws; public class StompConnectEvent implements ApplicationListener { @Override public void onApplicationEvent(SessionConnectEvent event) { StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage()); System.out.println("StompConnectEvent::onApplicationEvent() sha.getSessionId(): "+sha.getSessionId()+" sha.toNativeHeaderMap():"+sha.toNativeHeaderMap()); //String company = sha.getNativeHeader("company").get(0); //logger.debug("Connect event [sessionId: " + sha.getSessionId() +"; company: "+ company + " ]"); // HERE YOU CAN MAYBE SEND A MESSAGE } }
查看此链接以获取更多信息:
http://www.sergialmar.com/2014/03/detect-websocket-connects-and-disconnects-in-spring-4/