サーバーからクライアントにstompを使用してメッセージを送信しようとしています。クライアント側でsock.jsとstompを使用すると、コントローラメソッドで@SendToアノテーションを使用するだけで、サーバー側で多くの操作を行うことなく、あるユーザーから別のユーザーにメッセージを送信できます。しかし、ユーザーが受け取るメッセージはサーバー上で生成されます(実際はオブジェクト全体を送信していますが、簡単にするためにStringを送信しようとしています)。具体的には、これはフレンドリクエスト受諾を扱い、あるユーザがフレンドリクエストを受け入れると、そのリクエストを送ったユーザは、リクエストが受け入れられたというメッセージを受け取るべきです。したがって、要求を受け入れるための残りのコントローラメソッドへの単純なAjax呼び出しの後、メソッドは他のユーザーにもメッセージを送信する必要があります。ここでは、コードです:Spring stomp - SimpMessagingTemplateを使用してサーバーからメッセージを送信する
@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;
}
}
そして、ここでウェブソケット構成です:
@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);
});
});
}
、すべてが書かれていますデータベースで正常に動作します。私はページをリフレッシュすると、他のユーザーが私の友人であることがわかります。しかし、他のユーザは、自分の要求が受け入れられたというメッセージを受け取ることはありません。 私が間違っていることはありますか?どんな助けでも大歓迎です。ありがとう!
答えが得られましたか? –
私はこの問題を別の方法で解決しました。 "/ project_sjs/notify/acceptNotification"という同じエンドポイントにすべてのユーザーをサブスクライブするのではなく、ユーザー名で区別するのではなく、 "/ project_sjs/notify/acceptNotification/John123"のように各ユーザーを別のエンドポイントにサブスクライブしました。このように、ユーザ名がJohn123のユーザ(ユーザ名が一意であるため、1人だけです)が通知を受け取ります。そしてそれは十分にうまくいった。 –