spring - @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);
}
解决方案
仅从预定的端点调用 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);
}
}
推荐阅读
- python - Heroku 连接到随机 postgresql 服务器而不是 MongoDB
- firebase - 使用 AppEngine 和 Firebase 身份验证电子邮件模板的自定义域
- arrays - 在 Python3 中为多维 numpy 图像添加额外维度
- xml - talend - 处理多个 XML 文件 - 不同语言的相同内容
- php - 验证规则唯一性至少需要 1 个参数。unique/require 参数问题
- sql - 如果我想从另一个表中获取 3 个不同的 ID(带有其他信息),是否需要将多个 ID 放在一个表中?
- linux - 如何使用gtk绘制图形?
- javascript - 为什么 React JSX 元素事件处理程序不使用类似于 html 事件处理程序的括号?
- python - Python 日期和时间格式
- python - 在 Heroku 中安装 Python 依赖项