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