如何使用Spring WebSocket向自定义用户发送自定义消息?
我是spring websocket的新手。我想将产品变更发送给客户。为此,我想这样做:客户端创建套接字连接并订阅目标:
var socket = new SockJS('/websocket');var stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
stompClient.subscribe('/product/changes', function (scoredata) {
// We received product changes
});
});
//Send Ajax request and say server I want to know product with id=5 changes.
sendAjaxRequest(5);
我已经将spring app配置如下:
@Configuration@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/product/");
registry.setApplicationDestinationPrefixes("/app");
}
}
现在,我需要以下方法:
@RestControllerpublic class ProductController {
@GetMapping("product-{id}")
public void startSubscribe(@PathVariable("id") Long id) {
// register current websocket session with product id and
// then with convertAndSendToUser send changes to current user.
}
}
我该如何实施?
回答:
首先,我的问题是,当您成功将Websocket与stomp集成时,为什么要尝试将HTTP请求发送到rest控制器?如果我正确地理解了您的用例,那么我可以想到的atm应该有三种解决方案。
回答:
您可以通过打开的websocket连接将请求直接从客户端发送到服务器。然后,Spring可以确定哪个Websocket会话进行了调用,然后可以实现您的业务逻辑。您需要激活另一个称为“
/
queue”的代理,并为预定用于广播的订阅指定用户目标的前缀。在客户端,您还必须更改订阅路径。最后,您必须创建一个用@Controller注释的类,该类包含您的消息映射以从连接的客户端接收消息。
服务器配置
@Configuration@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/queue", "/product"); // <- added "/queue"
registry.setApplicationDestinationPrefixes("/app");
registry.setUserDestinationPrefix("/user");
}
}
服务器控制器
@Controllerpublic class WebSocketContoller{
@Autowired
private SimpMessagingTemplate simpMessagingTemplate;
@MessageMapping("/product/register")
public void register(@Payload Long productId, @Header("simpSessionId") String sessionId) {
// register current websocket session with product id and
// then with convertAndSendToUser send changes to current user.
// Example of how to send a message to the user using the sessionId
String response = "This could also be one of your product objects of type Product";
SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
headerAccessor.setSessionId(sessionId);
headerAccessor.setLeaveMutable(true);
messagingTemplate.convertAndSendToUser(sessionId,"/queue/product/changes", response, headerAccessor.getMessageHeaders());
}
}
客户订阅变更
stompClient.subscribe('/user/queue/product/changes', function (scoredata) { // We received product changes
});
回答:
但是,如果您确实要考虑使用rest控制器来开始注册您的进程,或者如果它不满足您的要求,则应查看下面的链接。Spring还能够通过公开的SimpUserRegistry
bean跟踪活动的Websocket会话及其用户。但是,您将需要根据应用程序的安全性为客户端输入通道配置自定义ChannelInterceptor适配器,以确定用户。
回答:
您还可以订阅特定的产品ID主题,因此甚至不需要知道要通知特定产品更改的用户。
客户订阅变更
//e.g if you want to be notified about changes for products with id 5 stompClient.subscribe('/product/changes/5', function (scoredata) {
// We received product changes
});
服务器服务示例
@Servicepublic class WebSocketProductService{
@Autowired
private SimpMessagingTemplate simpMessagingTemplate;
// This would be the method which should inform your clients about specific product
// changes, instead of the String parameters a Product object should be used instead,
// you have to call this method yourself on product changes or schedule it or sth.
public void sendProductChange(String product, String productId) {
this.simpMessagingTemplate.convertAndSend("/product/changes/"+productId, product);
}
}
服务器控制器
如果要管理产品ID订阅列表,则需要。如解决方案1中所述,您需要一个用@Controller注释的类,其中包含一个用@SubscribeMapping注释的方法。如果客户端尝试订阅指定的路径,则调用此方法。
@Controllerpublic class WebSocketContoller{
@SubscribeMapping("/product/changes/{productId}")
public void productIdSubscription(@DestinationVariable Long productId) {
//Manage your product id subscription list e.g.
}
}
以上是 如何使用Spring WebSocket向自定义用户发送自定义消息? 的全部内容, 来源链接: utcz.com/qa/419838.html