我正在开发一个Java Spring Boot Application,它向所有订阅的客户端广播数据。所有数据始终都有一个时间戳字段,显示创建数据的时间。现在,所有客户端都应该能够按开始和结束时间进行过滤。 我们的想法是每个客户订阅不同的主题,并首先通过GET请求获取所选时间范围内的所有数据,之后只有在所选时间范围内添加新数据时才会获得更新。所以我发送一个GET请求并通过符合指定时间范围的WebSocket获取所有数据。
到目前为止,这一切都有效,只是新数据仅被广播给符合所选时间范围的客户。
在我的REST控制器中,我使用SimpMessagingTemplate
将数据广播到相应的主题。现在我需要某种拦截器,它允许我在广播给客户端之前过滤数据。有没有办法在后端解决这个问题,还是我必须在客户端过滤数据?我只是认为将所有数据广播到所有客户端并且客户端只丢弃它不需要的所有数据真的效率很低。
这是我的websocket配置:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
public static final String COMMANDS_QUEUE = "/commands";
public static final String FILES_QUEUE = "/files";
public static final String DATA_QUEUE = "/data";
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker(
WebSocketConfig.COMMANDS_QUEUE,
WebSocketConfig.FILES_QUEUE,
WebSocketConfig.DATA_QUEUE);
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/cdh/websocket")
.setAllowedOrigins("*")
.addInterceptors(new HttpHandshakeInterceptor())
.withSockJS();
}
}
连接后,客户端将检索所选时间范围内的所有命令,这些命令是通过构建谓词并设置开始和结束时间来完成的:
@GetMapping(produces = APPLICATION_JSON_VALUE)
@ResponseStatus(OK)
public void getCommands(CommandProperties commandProperties) {
List<Command> commands = commandService.getCommands(commandProperties.buildPredicate(),
new PageRequest(commandProperties.getPageIndex(), commandProperties.getPageSize()));
messagingTemplate.convertAndSend(WebSocketConfig.COMMANDS_QUEUE,
commands.stream().map(commandMapper::toMessage).collect(Collectors.toList()));
}
每当我创建一个新命令时,都会向所有客户端广播新命令:
@PostMapping(consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
@ResponseStatus(CREATED)
public CommandMessage createCommand(@Valid @RequestBody CommandMessage commandMessage) {
Command command = commandService.createCommand(commandMapper.toResource(commandMessage));
messagingTemplate.convertAndSend(WebSocketConfig.COMMANDS_QUEUE, commandMapper.toMessage(command));
return commandMapper.toMessage(command);
}
现在最后一个缺失的部分是如何过滤开始和结束时间广播的数据?
提前感谢您的支持:)