【发布时间】:2023-03-22 03:06:02
【问题描述】:
我有一个基于计时器的工作
@Component
public class Worker {
@Scheduled(fixedDelay = 100)
public void processEnvironmentActions() {
Job job = pickJob();
}
public Job pickJob() {
Job job = jobRepository.findFirstByStatus(Status.NOT_PROCESSED);
job.setStatus(Status.PROCESSING);
jobRepository.save(job);
return job;
}
}
现在,在大多数情况下,这应该会给我正确的结果。但是如果有两个微服务实例同时执行这段代码会怎样呢?
我如何确保即使有多个服务实例,存储库也应始终将一项作业只分配给一个实例而不是其他实例。
编辑:
我认为人们对@Transactional 感到困惑/集中注意力所以将其删除。问题还是一样的。
【问题讨论】:
-
你知道
@Transactional在this上调用方法的情况下不起作用吗? -
如果方法是
public应该可以吧?例如,我将其编写为private方法,但如果我将其编写为public,如何实现多个实例之间的同步? -
我不知道如何回答你的问题。我只是注意到您的代码中存在问题。
-
我认为您的问题是:如何跨多个服务实例实现分布式工作队列?
-
@talex 是对的。 Transactional 不适用于本地调用,因为不涉及代理。要解决您的问题,您需要查看整个工作表。我稍后会添加答案。
标签: java hibernate spring-boot jpa spring-data-jpa