@Scheduled и websocket, сообщение не доходит до клиента Angular

#spring #spring-boot #websocket

#spring #spring-загрузка #websocket

Вопрос:

У меня возникли проблемы с отправкой сообщений websocket клиенту с использованием задачи @Scheduled. Я добавил приведенный ниже код. Каждую минуту я проверяю, есть ли у меня какие-либо задания, которые должны запускаться автоматически, и если таковые имеются, я запускаю их и отправляю сообщение websocket, чтобы клиент знал, что задание запущено.

Прямо сейчас все остальное, кроме части websocket, работает. Клиент просто не получает сообщение, но я знаю, что это работает, потому что я использую тот же updateLogisticClients метод и в других местах, и он работает в 100% случаев.

Я думаю, это из-за @Scheduled, потому что это работает для обычных методов… Есть идеи?

 @Transactional
@Scheduled(cron = "0 * * * * *")
public List<DayJob> startRentJobsAutomatically() {
    List<DayJob> dayJobsToStart = getRentJobsToStart();
    for (DayJob dayJob : dayJobsToStart) {
        dayJob.setActualStartTime(dayJob.getStartTime());
        dayJob.setStatus(DayJob.DayJobStatus.in_progress);
        DayJobDetailResponse response = new DayJobDetailResponse(dayJobRepository.save(dayJob));
        updateLogisticClients(response);
    }
    return dayJobsToStart;
}

@SendTo("/logistic-data/day")
public void updateLogisticClients(DayJobDetailResponse response) {
    System.out.println("SENT");
    webSocket.convertAndSend("/logistic-data/day/"   CompanyContext.getCurrentCompanyId(), response);
}
  

Ответ №1:

Простой вызов конечной точки веб-сокета из запланированного не приведет к ее запуску для вас. Используйте отдельный запланированный компонент, такой как :

 @Component
public class ScheduledUpdatesOnTopic{

    @Autowired
    private SimpMessagingTemplate template;

    @Scheduled(fixedDelay=300)
    public void publishUpdates(){
      List<DayJob> dayJobsToStart = getRentJobsToStart();
      for (DayJob dayJob : dayJobsToStart) {
        dayJob.setActualStartTime(dayJob.getStartTime());
        dayJob.setStatus(DayJob.DayJobStatus.in_progress);
        DayJobDetailResponse response = new DayJobDetailResponse(dayJobRepository.save(dayJ
        template.convertAndSend("/logistic-data/day", response);
    }
}
  

Комментарии:

1. Оказалось, что это еще одна проблема, хотя спасибо за помощь 🙂

Ответ №2:

Оказывается, CompanyContext.getCurrentCompanyId() возвращается null , и клиент прослушивает конкретную компанию I в зависимости от пользователя. У меня есть отдельные данные компании в базе данных, доступ к которой осуществляется через CompanyID, и если это задача @Scheduled, идентификатор компании не установлен 🙂