@Scheduled和websocket,消息未到达Angular客户

时间:2020-08-21 06:35:36

标签: spring spring-boot websocket

我无法使用@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);
}

2 个答案:

答案 0 :(得分:1)

仅从预定的端口调用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);
    }
}

答案 1 :(得分:0)

结果CompanyContext.getCurrentCompanyId()返回null,并且客户端根据用户侦听特定的公司I。我在通过companyId访问的数据库中有单独的公司数据,如果这是@Scheduled任务,则未设置companyId:)

相关问题