Spring stomp - 使用SimpMessagingTemplate从服务器发送消息

时间:2016-06-12 13:55:08

标签: javascript java spring websocket stomp

我正在尝试使用stomp从服务器向客户端发送消息。我知道在客户端使用sock.js和stomp我只需在控制器方法中使用@SendTo注释,就可以从一个用户向另一个用户发送消息,而无需太多的服务器端交互。但是,我希望用户接收的消息是在服务器上生成的(实际上,我正在发送一个完整的对象,但为了简单起见,我们只是说我正在尝试发送一个字符串)。具体而言,这涉及朋友请求接受,并且当一个用户接受朋友请求时,发送请求的人应该接收他的请求被接受的消息。因此,在对休息控制器方法进行简单的ajax调用以接受请求之后,该方法还应该将消息发送给其他用户。这是代码:

@RestController
@RequestMapping("/rest/user")
public class UserController{
    @Autowired
    SimpMessagingTemplate simp;

    @RequestMapping(value="/acceptFriendRequest/{id}", method=RequestMethod.GET, produces = "application/json")
    public boolean acceptFriendRequest(@PathVariable("id") int id){
        UserDTO user = getUser(); // gets logged in user
        if (user == null)
            return false;
        ... // Accept friend request, write in database, etc.
        String username = ... // gets the username from a service, works fine
        simp.convertAndSendToUser(username, "/project_sjs/notify/acceptNotification", "Some processed text!");
        return true;
    }
}

这是Web套接字配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

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

    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {

        config.enableSimpleBroker("/notify");
        config.setApplicationDestinationPrefixes("/project_sjs");
    }


}

这是javascript函数:

function setupWebsockets(){
    var socketClient = new SockJS("/project_sjs/sendNotification");
    stompClient = Stomp.over(socketClient);
    stompClient.connect({}, function(frame){
        stompClient.subscribe("/project_sjs/notify/acceptNotification", function(retVal){
            console.log(retVal);
        });
    });
}

当用户接受好友请求时,数据库中的所有内容都可以正常写入。当我刷新页面时,我甚至可以看到其他用户现在是我的朋友。但是,其他用户从未收到他的请求被接受的消息。 有什么我做错了吗?任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

我用不同的方法解决了这个问题。不是将所有用户订阅到同一端点“/ project_sjs / notify / acceptNotification”,然后通过用户名对它们进行区分,而是最终将每个用户订阅到不同的端点,例如“/ project_sjs / notify / acceptNotification / John123”。这样,每个人都使用用户名John123(只有一个人,因为用户名是唯一的)将收到通知。它运作良好。