首页 > 解决方案 > @Scheduled 和 websocket,消息未到达 Angular 客户端

问题描述

我无法使用 @Scheduled 任务向客户端发送 websocket 消息。我在下面添加了代码。每分钟我都在检查我是否有任何应该自动启动的作业,如果有的话,我会启动它们并发送一条 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);
}

标签: springspring-bootwebsocket

解决方案


仅从预定的端点调用 Web 套接字端点不会为您触发它。使用单独的计划组件,例如:

@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);
    }
}

推荐阅读