Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当用户连接到spring websocket时,如何向用户发送消息_Java_Spring_Stomp_Spring Websocket - Fatal编程技术网

Java 当用户连接到spring websocket时,如何向用户发送消息

Java 当用户连接到spring websocket时,如何向用户发送消息,java,spring,stomp,spring-websocket,Java,Spring,Stomp,Spring Websocket,我想在用户连接到SpringWebSocket时向他发送消息,我已经 @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Autowired private GenervicSerice<User> userService; @Autowired pr

我想在用户连接到SpringWebSocket时向他发送消息,我已经

@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()
                    );
        }

    }

}
@配置
@EnableWebSocketMessageBroker
公共类WebSocketConfig扩展了AbstractWebSocketMessageBrokerConfiger{
@自动连线
专用通用服务用户服务;
@自动连线
私有SimpMessagingTemplate;
私有CurrentUser CurrentUser;
@凌驾
公共无效注册表stompendpoints(StompEndpointRegistry StompEndpointRegistry){
//TODO自动生成的方法存根
stompEndpointRegistry.addEndpoint(“/ws”).withSockJS();
}
@凌驾
public void配置MessageBroker(MessageBrokerRegistry配置){
config.enableSimpleBroker(“/queue/”、“/topic/”、“/exchange/”;
config.setApplicationDestinationPrefixes(“/app”);
}
@凌驾
公共无效配置ClientInBoundChannel(通道注册){
registration.setInterceptors(mychannelintercepton());
试一试{
updateNotificationAndBroadcast();
}捕获(例外e){
返回;
}
}
@豆子
公共MyChannelInterception MyChannelInterception(){
返回新的MyChannelInterception();
}
私有void updateNotificationAndBroadcast(){
试试{
template.convertAndSend(“/queue/notify”,“问候语”);
}捕获(例外e){
System.out.println(“错误消息为“+e.getMessage()+”\n\n\n“+”由“+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;
    }

}
公共类ImtehanChannelInterception扩展了ChannelInterceptorAdapter{
私有CurrentUser CurrentUser;
@凌驾
公共消息呈现(消息消息、消息通道){
MessageHeaders=message.getHeaders();
SimpMessageType=(SimpMessageType)headers.get(“SimpMessageType”);
String simpSessionId=(String)headers.get(“simpSessionId”);
CurrentUser=新的CurrentUser();
if(type==SimpMessageType.CONNECT){
Principal=(Principal)headers.get(“simpUser”);
currentUser.setCurrentUserEmail(principal.getName());
System.out.println(“WsSession”+simpSessionId
+已为用户“+principal.getName())连接”;
}else if(type==SimpMessageType.DISCONNECT){
System.out.println(“WsSession”+simpSessionId
+“断开连接”);
}
返回消息;
}
}

通过此操作,我可以获得有关新连接用户的信息,但
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<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

    }

}
package mx.config.ws;
公共类StompConnectEvent实现ApplicationListener{
@凌驾
Application event(SessionConnect事件)上的公共无效{
StompHeaderAccessor sha=StompHeaderAccessor.wrap(event.getMessage());
System.out.println(“StompConnectEvent::onApplicationEvent()sha.getSessionId():”+sha.getSessionId()+“sha.toNativeHeaderMap():”+sha.toNativeHeaderMap());
//字符串company=sha.getNativeHeader(“company”).get(0);
//debug(“连接事件[sessionId:+sha.getSessionId()+”;“公司:+company+”]”;
//在这里你可以发个信息
}
}
查看此链接了解更多信息:

请在网上提供任何例子或资源,这样做可以挽救生命。我在这个问题上花了三天时间,但无法完成工作,请在此情况下提供帮助。更新示例请在“问候语”末尾添加
;谢谢,这是我想要的,它提出了另一个问题,但这将是一个新问题,非常感谢。