#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, идентификатор компании не установлен 🙂