我正在尝试使用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);
});
});
}
当用户接受好友请求时,数据库中的所有内容都可以正常写入。当我刷新页面时,我甚至可以看到其他用户现在是我的朋友。但是,其他用户从未收到他的请求被接受的消息。 有什么我做错了吗?任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
我用不同的方法解决了这个问题。不是将所有用户订阅到同一端点“/ project_sjs / notify / acceptNotification”,然后通过用户名对它们进行区分,而是最终将每个用户订阅到不同的端点,例如“/ project_sjs / notify / acceptNotification / John123”。这样,每个人都使用用户名John123(只有一个人,因为用户名是唯一的)将收到通知。它运作良好。