2016-05-20 3 views
3

Я хочу, чтобы отправить сообщение пользователю, когда он подключается к прыжку WebSocket, ЯКак отправить сообщение пользователю, когда он подключается к прыжку WebSocket

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 

    @Autowired 
    private GenervicSerice<User> 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; 
    } 

} 

через это я получаю информацию о новом подключенном пользователе, но метод updateNotificationAndBroadcast() в WebSocketConfig не отправляет сообщения новым зарегистрированным пользователям.

ответ

1

Я бы создал SessionSubscribeEvent слушатель и использовал SimpMessagingTemplate внутри.

Btw, 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"); 
    } 
} 

Я надеюсь, что это поможет

+0

Любого пример или ресурс в сети, пожалуйста, что акт будет экономить жизнь один. Я потратил три дня на эту проблему, но не смог выполнить работу, пожалуйста, помогите в этом случае. –

+0

Обновлено с помощью примера –

+0

Пожалуйста, добавьте ')' в конце __ "GREETINGS"; __ –

1

вам нужен 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<SessionConnectEvent> { 

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

Смежные вопросы