Как я могу запланировать «отправку» указанных данных каждые несколько секунд с помощью контроллера Spring Boot WebSocket?В настоящее время у меня есть следующий код:
@Controller
public class ServiceWebSocketController {
@Autowired
private ServiceService serviceService;
@Autowired
private SimpMessagingTemplate simpMessagingTemplate;
// This method works great, but a response is only sent to the client once.
@SubscribeMapping("/service/{serviceId}")
public ServiceDTO subscribed(@DestinationVariable("serviceId") final Long serviceId) throws SQLException {
return serviceService.getService(serviceId).orElseThrow(() -> new ResourceNotFoundException("Service", "id", serviceId));
}
// This does not work.
@Scheduled(fixedDelay = 2000)
public void service(@DestinationVariable("serviceId") final Long serviceId) throws SQLException {
simpMessagingTemplate.convertAndSend("/topic/service/", serviceService.getService(serviceId));
}
}
К сожалению, приведенный выше код не работает из-за исключения, генерируемого во время выполнения (java.lang.IllegalStateException: Encountered invalid @Scheduled method 'service': Only no-arg methods may be annotated with @Scheduled
).
В отличие от аннотации @SubscribeMapping
,Я не могу передать переменную назначения (например, serviceId
) от клиента, который подписывается на метод, чтобы узнать, на какой «service
» я должен подписаться.
Этот метод отлично работает, когда используется следующим образом:
@Scheduled(fixedDelay = 2000)
public void services() throws SQLException {
simpMessagingTemplate.convertAndSend("/topic/services", serviceService.getAllServices());
}
В последнем случае параметры метода остаются пустыми, и клиенту отправляется список всех служб.
Как клиент может подписаться на определенную публикацию (.eg, "/topic/services/{serviceId}
"), а затем периодически получать одни и те же данные, пока клиент не отменит подписку?