Как я могу запланировать «отправку» указанных клиентом данных каждые несколько секунд с помощью контроллера Spring Boot WebSocket? - PullRequest
0 голосов
/ 01 марта 2019

Как я могу запланировать «отправку» указанных данных каждые несколько секунд с помощью контроллера 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}"), а затем периодически получать одни и те же данные, пока клиент не отменит подписку?

...