我有一个场景,我希望用户订阅固定的websocket端点,并且在订阅时不需要提及queuename或主题。我想处理控制器内部的逻辑,以便从各自的队列中获取消息并发送回每个用户。 我希望实现这样的目标: -
我的客户端代码首先连接到websocket端点/ websocket: -
client.connectToServer( aWebsocketHandler, URI.create( "wss://host.com/websocket" ) );
然后通过websocket发送STOMP连接和订阅框架
STOMP connect frame :-
accept-version : 1.1
heart-beat : 100000,0
STOMP subscribe frame :-
destination : /app/fixed
id : 123
ack : auto
receipt : 123456
正在运行的服务器端代码控制器是: -
@SubscribeMapping ( "fixed" )
public void handle( Principal principal ) {
System.out.println( "principal.getName();" + principal.getName() );
String queueName = Helper.getClientToQueueMap().get( principal.getName() );
// in loop just for testing
while(true){
Object o = rabbitTemplate.receiveAndConvert(queueName);
if ( o != null ) {
System.out.println( "Returning mesg**" + o.toString() );
simpMessagingTemplate.convertAndSend( "/app/fixed", o.toString() );
}
try {
Thread.sleep(3000);
} catch ( InterruptedException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
我的网络配置如下: -
@Override
protected void configureStompEndpoints( StompEndpointRegistry registry ) {
registry.addEndpoint( "/websocket" ).setAllowedOrigins( "*" );
}
@Override
public void configureMessageBroker( MessageBrokerRegistry config ) {
config.enableStompBrokerRelay( "/topic/", "/queue/", "/exchange/" )
config.setApplicationDestinationPrefixes("/app");
config.enableSimpleBroker("/app");
}
现在我想修改此代码以将消息从队列发送到其各自的特定用户。即使每个用户都订阅相同的端点/ app / fixed,也不应该在它们之间共享任何消息。 通过几个帖子我发现客户端可以订阅/ user / queue / fixed而在控制器中我使用convertAndSendToUser发送给特定用户
simpMessagingTemplate.convertAndSendToUser( principal.getName(), "/queue/fixed", o.toString() );
但这不起作用。由于我订阅了/ user / queue / fixed,因此@SubscribeMapping(“fixed”)的控制器句柄方法永远不会被调用。有人可以帮我解决我做错的事吗?
答案 0 :(得分:0)
以下
对我有用控制器上的@SubscribeMapping(“/ user / queue / fixed”)
并且正在做
simpMessagingTemplate.convertAndSendToUser( principal.getName(), "/queue/fixed", o.toString() );
客户订阅/ user / queue / fixed